2014-07-15 33 views
2

我有一個代碼,我想單元測試。該代碼使用Collections.sort方法爲它提供我們自己的甜蜜比較類似:從集合中嘲笑排序方法

List<Something> something = somethingService.doSomething(someParameter); 
Collections.sort(something, somethingComparator); 

現在在測試我嘲諷somethingService功能和捻熄doSomething方法,如:

List<Something> mockList = Mockito.mock(List.class); 
Mockito.when(somethingService.doSomething(anyInt())).thenReturn(mockList); 

,我嘲笑該集合爲:

PowerMockito.mockStatic(Collections.class); 
PowerMockito.doNothing().when(Collections.class, "sort", anyListOf(Something.class), anyOf(Comparator.class)); 

但它給我:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Misplaced argument matcher detected 
You cannot use argument matchers outside of verification or stubbing. 

現在我知道如果我們在函數的任何參數中使用參數匹配器,我們需要爲所有參數提供匹配器。但是,這樣做有可能做到這一點,如果沒有,那麼現有的解決方法是什麼?

+0

@社區:請幫忙:) – Sourabh

+1

這很奇怪。我遇到了同樣的問題。但這[類似的答案](http://stackoverflow.com/a/22991435/1594933)作品 – gontard

+0

它看起來像一個錯誤。 – gontard

回答

0

您正在使用PowerMock從JDK嘲笑一個系統類,設計明智它是真的,真的很討厭。真的,人們應該真的認爲他的作者本人就是motivation to use Powermock

Powermock無法真正模擬系統類中的靜態方法,因此必須圍繞系統調用創建包裝,如wiki中所述。

我強烈建議你提取一些排序策略,你可以用Mockito來模擬。

+1

這個wiki條目展示瞭如何模擬URLEncoder,那麼爲什麼它不能和Collections一起工作? – gontard

+0

我想你需要打包電話,但是如果沒有完整的代碼,我們無法幫助您進行更多的診斷。 – Brice