2013-10-02 58 views
4

我想這樣做:問題用「OR」匹配器。當謂詞的Mockito

在一個
when(myObject.getEntity(1l,usr.getUserName()).thenReturn(null); 
when(myObject.getEntity(1l,Constants.ADMIN)).thenReturn(null); 

符合的匹配。所以,我有這樣的代碼:

import static org.mockito.Matchers.*; 
import static org.mockito.Mockito.*; 
import static org.mockito.AdditionalMatchers.*; 

[...] 

User usr = mock(usr); 

[...] 

when(myObject.getEntity(
    eq(1l), 
    or(eq(usr.getUserName()),eq(Constants.ADMIN)) 
    ) 
).thenReturn(null); 

但是,當我使用或者匹配,JUnit的失敗:

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers! 
0 matchers expected, 1 recorded. 
This exception may occur if matchers are combined with raw values: 
    //incorrect: 
    someMethod(anyObject(), "raw String"); 
When using matchers, all arguments have to be provided by matchers. 
For example: 
    //correct: 
    someMethod(anyObject(), eq("String by matcher")); 

For more info see javadoc for Matchers class. 
    at blah.blah.MyTestClass.setup(MyTestClass:The line where I use the when & or matcher) 
... more stacktrace ... 

什麼我'做錯了什麼?

謝謝!

+0

這個變化背後的動機是什麼?在考慮可讀性和可維護性時,它看起來起反作用。 – atomman

+3

是Mockito'AdditionalMatchers'類(它應該工作)的'or'方法還是你正在處理Hamcrest匹配器(它不會以這種方式工作)? –

+0

是的,是org.mockito.AdditionalMatchers類中的「or()」。 @Aomom ...沒有什麼嚴肅的動機。只有我想學習如何做到這一點:) – Nullpo

回答

4

因爲usr是一個模擬,所以內聯方法調用usr.getUserName()是拋出你的部分。由於Mockito實現和語法巧妙的原因,您不能在另一種方法的存根中調用模擬方法。

when(myObject.getEntity(
    eq(1l), 
    or(eq(usr.getUserName()),eq(Constants.ADMIN)) 
    ) 
).thenReturn(null); 

呼叫至匹配器的Mockito像eqor實際上返回如0和空虛值,和作爲副作用 - 他們增加他們的匹配器的行爲稱爲ArgumentMatcherStorage堆棧。只要Mockito在模擬中看到一個方法調用,就會檢查堆棧以查看它是否爲空(即,檢查所有參數是否相等)或被調用方法的參數列表的長度(即使用堆棧中的匹配器,每個參數)。其他任何事情都是錯誤的。

鑑於評估Java的順序,你的代碼評估eq(1l)第一個參數,然後usr.getUserName()第二個參數,第一or參數。請注意,getUserName不需要任何參數,因此預計會有0,並且有1個記錄爲

這應該很好地工作:

String userName = usr.getUserName(); // or whatever you stubbed, directly 
when(myObject.getEntity(
    eq(1l), 
    or(eq(userName),eq(Constants.ADMIN)) 
    ) 
).thenReturn(null); 

要了解更多關於如何的Mockito在幕後工作的匹配器,看到我other SO answer here

+0

傑出的答案!這個答案有效,並且完全完整。謝謝! – Nullpo