2016-12-14 52 views
1

我們如何替換存根void方法的方法體? 事情是這樣的:在mockito中添加虛空方法帶有副作用

interface Foo { 
    void foo(Integer j); 
} 

(...) 

Foo mockFoo = mock(Foo.class); 

Answer<Void> ans = invocation -> { 
      Object[] args = invocation.getArguments(); 
      System.out.println("called with arguments: " + Arrays.toString(args)); 
      return null; 
     }; 

when(mockFoo.foo(any())).thenAnswer(ans); 

(...) 

mockFoo.foo(5) // Should print out "called with arguments: [5]" 

它能夠對參數進行訪問,並能夠執行使用這些參數的一些代碼是很重要的。

我們試圖doAnswer(ans).when(mockFoo).foo(any());,但似乎建立模擬何時執行ANS拉姆達幾次的身體,併爲.when(mockFoo).foo(any())調用之間一些奇怪的原因,重置我們mockFoo變量設置爲「零」。

那麼有效:

Foo mockFoo = mock(Foo.class) 
// mockFoo is an instance of a Foo$MockitoMock 

Foo o = doAnswer(ans).when(mockFoo); 
// mockFoo just became null at this point..?! 
o.foo(any()); 

附:我們使用VertxUnitRunner來運行測試,但問題仍然存在於MockitoJUnitRunner中。

感謝, 阿科什Vandra

+0

請參閱http://stackoverflow.com/questions/2276271/how-to-make-mock-to-void-methods-with-mockito – pringi

+0

你有什麼是正確的,並且肯定沒有理由說'mockFoo'應該永遠重置。您可以向我們展示實際的測試機構設置,而不是您發佈的代碼段?我有一種感覺,你的問題在那裏,而不是你發佈的代碼。 –

+0

@JeffBowman你是對的。在我的實際測試中,我提供了任何()作爲int的參數,這似乎是原因。用anyInt()替換它解決了這個問題。 –

回答

0

在評論中解決:

你是對的。在我的實際測試中,我提供了任何()作爲int的參數,這似乎是原因。用anyInt()替換它解決了這個問題。

這是很難警告,因爲異常來自的Mockito的默認null值(由於擦除必要)被自動取消裝箱(必要的,因爲爪哇5+語義),這是外面的Mockito的控制的和前Mockito知道你的測試正在試圖調用哪個方法簽名。這也不是Mockito異常,或者甚至是Mockito故意調用的異常,所以錯誤消息很難通過建議進行修改。

對於原始值中的Mockito匹配器的所有用法,請使用適當的原語:anyInt,intThat等等。