【发布时间】: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