Mockito - 自定义匹配器在尝试匹配原始时抛出NPE

时间:2011-12-14 14:49:29

标签: java mockito

试图弄清楚如何为原始值编写自定义匹配器。假设我有以下自定义匹配器:

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

我运行以下测试。 'mocked'是一个已经被模拟的类的实例,它有一个方法'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,我猜测它不能自动装回一个整数。

我觉得这个问题好像是一个常见的用例 - 有什么建议吗?

谢谢, 罗伊

2 个答案:

答案 0 :(得分:7)

..阅读Javadoc有帮助:

在极少数情况下,当参数是基元时,必须使用相关的intThat(),floatThat()等方法。这样,您将在自动装箱期间避免NullPointerException。

答案 1 :(得分:0)

对于任何方法,您可以使用doThrow(),doAnswer(),doNothing(),doReturn()和doCallRealMethod()来代替使​​用when()的相应调用。

时有必要

stub void方法 间谍对象的存根方法(见下文) 多次使用相同的方法,在测试过程中更改模拟的行为。 但对于所有的存根调用,您可能更愿意使用这些方法代替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();