2011-12-14 36 views
2

試圖找出如何爲原始值編寫自定義匹配器。假設我有以下自定義匹配器:Mockito - 自定義匹配器在嘗試匹配原語時拋出NPE

class IsEven extends ArgumentMatcher<Integer> { 
    public boolean matches(Object i) { 
     return ((Integer) i) % 2 == 0; 
    } 
} 

然後我運行以下測試。 「嘲笑」是有方法的類的已經嘲弄實例「的someMethod」:

@Test 
public void primatives() { 

    mocked.someMethod(2); 

    ArgumentMatcher<Integer> customMatcher = new IsEven(); 

    // ! Throws NPE ! 
    Mockito.verify(mocked).someMethod(Mockito.argThat(customMatcher)); 

} 

的原因NullPointerException異常的是,Mockio.argThat方法總是返回null,這我猜不能被自動複製回一個整數。

我感覺好像這個woudl是一個常見的用例 - 任何建議?

感謝, 羅伊

回答

6

..閱讀的Javadoc幫助:

在極少數情況下,當參數是原始的,那麼你必須使用相關intThat(),floatThat()等方法。這樣你就可以在自動裝箱時避免NullPointerException。

0

對於任何方法,您可以使用doThrow(),doAnswer(),doNothing(),doReturn()和doCallRealMethod()代替與when()對應的調用。這是必要的當你

存根無效方法 間諜對象的存根方法(見下文) 存根相同的方法不止一次,以改變測試中的模擬行爲。 但您可能更願意使用這些方法替代when(),用於所有存根調用。

when(mock.foo()).thenThrow(new RuntimeException()); 

    //Impossible: the exception-stubbed foo() method is called so RuntimeException is thrown. 
    when(mock.foo()).thenReturn("bar"); 

    //You have to use doReturn() for stubbing: 
    doReturn("bar").when(mock).foo();