2014-01-14 58 views
0

我被困在我的第一個與Mockito的jUnit測試。檢查是否有void方法被調用

我必須測試一個方法,它將ArrayList作爲參數。在這個方法中,會有另一個運行Runtimes執行的類。所以我需要用Runtime執行來嘲笑這個類,因爲他們想在Jenkins上失敗(因爲Jenkins在Linux上運行)。

首先兩類:
HandleInformation testClass;將被testet
XFDHandler test;的接口與運行時執行類,該類稱爲XFDHandlerProd

所以首先我嘲笑運行級:

test = Mockito.mock(XFDHandlerProd.class); 

這四種方法都是void - 方法,所以當我理解official doc時方法本身不應該做任何事情正確:

Beware that void methods on mocks do nothing by default!

於是我會盡我的第一個測試:turnOnBlue();

@Test 
public void testNullList() throws IOException, InterruptedException { 
    ArrayList<Info> nullArray = new ArrayList<Info>(); 

    testClass.handleInformation(nullArray); 
    Mockito.verify(test, Mockito.times(1)).turnOnBlue(); 
} 

當我發送一個空列表中的TestClass,它應該叫的空隙方法運行級。據我所知,使用verify方法,我可以檢查方法是否真的被調用。

但是當我現在運行測試,我會收到以下錯誤:

Wanted but not invoked: xFDHandlerProd.turnOnBlue();
-> at com.example.example.business.HandleInformationTest.testNullList(HandleInformationTest.java:44)
Actually, there were zero interactions with this mock.

併線#44是Mockito.verfiy()

行現在我不知道我的」做錯了。


思想
是通信零監守我在HandleInformation類使用我用的是XFDHandler的另一個實例,所以可以的Mockito沒有看到任何活動?
如果是這樣,我如何能夠在測試中使用Mockito類而不改變HandleInformation類中的任何方法?

+0

你是在'testClass'中注入/設置'test'實例嗎?您的想法可能是正確的,因爲您需要將創建的XFDHandler模​​擬注入到HandleInformation類中。你的HandleInformation類是如何實例化的? – Saket

+0

你可以添加代碼來顯示你如何設置'testClass'對象嗎? – Jonathan

+1

恩,這不是一個空數組,這是一個_empty_數組,這是有區別的。雖然不是你的問題(或者至少,我懷疑它)。 –

回答

1

看來你需要通過colaborator作爲參數。這意味着你需要類似這樣的東西:

XFDHandler test = Mockito.mock(XFDHandlerProd.class); 
HandleInformation testClass = new HandleInformation(test); 

然後你的測試會奏效。

順便說一句,我會刪除Mockito.times(1),因爲它的默認行爲

+0

就是這樣。非常感謝。 是的,我只是在文檔中看到它,我可以刪除它。乾杯 –

0

你應該使用setter方法或構造函數或只是通過方法參數注入你的嘲笑對象插入被測物,使可能的Mockito瞭解何時你正在測試的對象調用模擬對象方法

相關問題