2011-08-26 55 views
8

我正在尝试一个使用EasyMock的非常简单的例子,但是我根本无法构建它。我有以下的测试案例:在非常简单的例子中使用EasyMock.expect()编译错误?

@Test 
public void testSomething() 
{ 
    SomeInterface mock = EasyMock.createMock(SomeInterface.class); 
    SomeBase expected = new DerivesFromSomeBase(); 

    EasyMock.expect(mock.send(expected)); 
} 

但是我得到的EasyMock.expect(...线以下错误:

The method expect(T) in the type EasyMock is not applicable for the arguments (void) 

有人可以点我在正确的方向?我完全失去了。

回答

10

如果您想测试void方法,请在您的模拟中调用您想要测试的方法。然后致电expectLastCall()方法。

下面是一个例子:

@Test 
public void testSomething() 
{ 
    SomeInterface mock = EasyMock.createMock(SomeInterface.class); 
    SomeBase expected = new DerivesFromSomeBase(); 

    mock.send(expected); 

    EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() { 
     public Object answer() { 
      // do additional assertions here 
      SomeBase arg1 = (SomeBase) EasyMock.getCurrentArguments()[0]; 

      // return null because of void 
      return null; 
     } 
    }); 
} 
+0

你的例子不编译。 'IAnswer'是一个通用的,需要一个模板。如果我使用'IAnswer '''answer()'方法的范围内没有方法'getCurrentArguments()'。我究竟做错了什么? –

+0

@bjarkef你是对的,它应该是'EasyMock.getCurrentArguments()'。我有一个静态导入,所以我没有注意到它缺少。 – Jasper

8

由于你send()方法返回void,只需调用模拟方法与预期值和重播:

SomeInterface mock = EasyMock.createMock(SomeInterface.class); 
SomeBase expected = new DerivesFromSomeBase(); 
mock.send(expected); 
replay(mock); 
+0

后'重播()'我则预期表现,将真正使'mock.send的动作()'的情况发生。并且EasyMock会断言,我所期望的具有相同参数的相同调用是从我的受测试类执行的? –

+0

是的,这是正确的@bjarkef。 –

0

因为你是嘲讽的接口,在嘲笑的方法的唯一目的是要返回来自该方法的结果。在这种情况下,看起来你的'send'方法的返回类型是无效的。 'EasyMock.expect'方法是通用的,并且期望返回类型,这会导致编译器告诉您不能使用void方法,因为它没有返回类型。

有关更多信息,请参阅EasyMock API文档http://easymock.org/api/easymock/3.0/index.html

0

你不能以这种方式编写带有void return的方法;请查看this question以了解如何在expected对象上模拟send方法的行为。

相关问题