我编写了下面的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());