NullPointerException在使用ArgumentMatcher时



我编写了下面的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中指定的。但是我不知道为什么我的测试不能工作,当例子中的那些-以完全相同的方式建模-工作

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

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

我很确定mockito的Javadoc也说在处理本机类型时使用intThat, booleanThat风格的方法。使用这些将阻止编译器引入的自动拆箱代码。

在另一个主题中,我建议您编写这样的代码,以使其更易于阅读。

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);
}

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

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

相关内容

  • 没有找到相关文章

最新更新