2011-08-26 78 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方法的行爲。