嘲諷

2016-07-15 145 views
0

時無效的匹配我想測試一下這個方法:嘲諷

public void some_method(SomeFactory someFactory) { 
     A a = someFactory.populateWithParameter(parameter1, parameter2, parameter3, parameter4); 
     a.method_call(); 
     .... 
    } 

工廠去這樣

public class SomeFactory(){ 

// some constructor 
public A populateWithParameter(SomeClass1 someClass1, SomeClass2 someClass2, String string, int parameter){ 
return new A(someClass1, someClass2, string, parameter) 
} 
} 

和測試

public void testSomeMethod() throws Exception { 
     SomeFactory someFactory = mock(SomeFactory.class); 
     when(someFactory.populateWithParameter(
       any(SomeClass1.class), any(SomeClass2.class), 
      anyString(), anyInt())).thenReturn(notNull()); 

     mainActivity.some_method(someFactory); 
... 
    } 

我得到這個消息

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers! 
4 matchers expected, 1 recorded: 
+1

也許這個問題是因爲你正試圖返回一個匹配器在你的thenReturn(notNull())。你可以嘗試返回一個A(或一個模擬版本)的實例嗎? http://stackoverflow.com/a/26418391/6526330 –

+0

@ Dr.Nitpick我已經試圖返回一個實例,但它不工作! – user1611830

+0

當你說它不起作用時,究竟發生了什麼? – jbarat

回答

0

您不允許使用notNull()作爲返回值。匹配器的Mockito只站在了參數在調用whenverify,而不能作爲返回值工作。特別是,notNull()實際上將返回NULL並標記「非空」比賽作爲一個隱藏的堆棧,在那裏徘徊,直到你與模擬未來(實際上當你調用some_method)相互作用的副作用。

雖然你沒有列出您的堆棧跟蹤你的InvalidUseOfMatchersException,我敢打賭,在錯誤實際發生時,你通過some_method調用populateWithParameter,而不是當你存根populateWithParameter。 「1記錄」匹配器是notNull(),其中「4匹配者預期」是指方法調用中參數的數量。該錯誤消息是真正專爲在那裏你忘記用匹配的一些參數,如populateWithParameter(any(), any(), anyString(), 42),這是一個非常常見的錯誤的情況下。

雖然我在評論中看到,「這是行不通的!」當您嘗試返回一個實例時,我可以保證返回notNull()絕對會導致問題,而返回實例可能會簡單地顯示不同的問題。切換到返回實例後,您可能需要使用完整的堆棧跟蹤來更新您的問題,或者提出一個新問題。

有關幕後的Mockito匹配器的更多信息,請參閱my question/answer here