2011-12-14 121 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();