NullPointerException при работе с ArgumentMatcher - PullRequest
1 голос
/ 09 ноября 2011

Я написал следующий тест 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. Но я не знаю, почему мой тест не сработает, когда те, что в примере - которые смоделированы точно так же, - работают.

1 Ответ

5 голосов
/ 09 ноября 2011

У вас есть NullPointerException, потому что подпись метода использует собственный тип, и вы используете Matchers.argThat, который возвращает объект.

При компиляции Javac добавит код автоматической распаковки около Matchers.argThat(new AnyBooleanMatcher()), как вы сказали, он возвращает null, так что у вас есть причина NPE.

Я почти уверен, что Javadoc mockito также говорит, что при работе с методом используется стиль 10000 *, 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);
}
...