3

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

NullPointerException不幸的是,在when声明中我总是得到一个, 。

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

4

2 回答 2

6

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

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

我很确定 mockito 的 Javadoc在处理本机类型时也说使用intThat, style 方法。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);
}
于 2011-11-09T09:48:08.590 回答
0

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

doReturn(new AnyBooleanMatcher()).when(mockService).search(Matchers.argThat(new MyObjectMatcher());
于 2020-11-29T19:32:45.237 回答