【问题标题】:NullPointerException when working with ArgumentMatcher使用 ArgumentMatcher 时出现 NullPointerException
【发布时间】:2011-11-09 07:32:21
【问题描述】:

我编写了以下 JUnit 测试,它使用 ArgumentMatchers

    MyClass classUnderTest = new MyClass();

    class AnyBooleanMatcher extends ArgumentMatcher<Boolean> {
        public boolean matches(Object argument) {
            return ((Boolean) argument).equals(Boolean.TRUE);
        }
    }

    class MyObjectMatcher extends ArgumentMatcher<MyObject> {
        public boolean matches(Object argument) {
            return ((MyObject) argument).getValue().equals("123");
        }
    }

    final Service mockService = mock(Service.class);

    when(mockService.search(Matchers.argThat(new MyObjectMatcher()),
            Matchers.argThat(new AnyBooleanMatcher())));

    classUnderTest.callMethod(mock(ActionEvent.class));

    verify(mockService).search(Matchers.argThat(new MyObjectMatcher()),
            Matchers.argThat(new AnyBooleanMatcher()));

不幸的是,我总是在when 声明中收到NullPointerException

我什至知道为什么:argThat 返回 null,正如 JavaDoc 中所指定的那样。但我不知道为什么我的测试不起作用,而 example 中的测试 - 以完全相同的方式建模 - 起作用。

【问题讨论】:

  • NPE 究竟在哪里? when 语句有很多嵌入式方法调用——哪一个导致了 NPE?
  • 我认为 NPE 发生在 Matchers.argThat(new MyObjectMatcher())。至少当我在方法中提取此语句时也会发生这种情况(如 Mockito 文档中所建议的那样)。如前所述,argThat 应该是定义返回null。 :-|

标签: java junit mocking mockito matcher


【解决方案1】:

您有一个NullPointerException,因为方法签名使用的是本机类型,而您使用的是Matchers.argThat,它返回一个对象。

编译后的 Javac 会在 Matchers.argThat(new AnyBooleanMatcher()) 周围添加自动拆箱代码,正如你所说,它返回 null,所以你有 NPE 的原因。

我很确定 mockito 的 Javadoc 也说在处理原生类型时使用 intThatbooleanThat 样式方法。使用这些将阻止编译器引入的自动拆箱代码。

关于另一个话题,我建议你编写这样的代码,以使其更具可读性。

when(mockService.search(argThat(hasValue("123")), booleanThat(isTrue()))).thenReturn("something");

// ...

private AnyBooleanMatcher isTrue() {
    return new AnyBooleanMatcher();
}

private MyObjectMatcher hasValue(String value) {
    return new MyObjectMatcher(value);
}

【讨论】:

  • 谢谢。自动装箱导致 NullPointerException。
  • 谢谢。 Native Type 让我意识到自己的错误。
【解决方案2】:

如果您正在寻找when.. thenReturn.. 语法:

doReturn(new AnyBooleanMatcher()).when(mockService).search(Matchers.argThat(new MyObjectMatcher());

【讨论】:

    猜你喜欢
    • 2013-12-29
    • 2013-12-19
    • 2022-01-19
    • 2013-04-13
    • 2014-11-11
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多