【问题标题】:Mockito - Custom Matcher throws NPE when trying to match primitiveMockito - 自定义匹配器在尝试匹配原语时抛出 NPE
【发布时间】:2011-12-14 14:49:29
【问题描述】:

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

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,我猜它不能自动装箱回整数。

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

谢谢, 罗伊

【问题讨论】:

    标签: java mockito


    【解决方案1】:

    .. 阅读 Javadoc 会有所帮助:

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

    【讨论】:

      【解决方案2】:

      对于任何方法,您都可以使用 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();
      

      【讨论】:

        猜你喜欢
        • 2016-06-15
        • 1970-01-01
        • 2020-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多