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

私はその理由さえ知っています:JavaDocで指定されているようにをargThat返します。しかし、例のテスト(まったく同じ方法でモデル化されているnull)が機能するのに、なぜ私のテストが機能しないのかわかりません。

4

2 に答える 2

6

NullPointerExceptionメソッドシグネチャがネイティブタイプを使用してMatchers.argThatいて、オブジェクトを返すを使用しているためです。

Matchers.argThat(new AnyBooleanMatcher())コンパイルすると、Javacは、を返すと言ったように、の周りに自動アンボックスコードを追加するnullので、NPEの原因があります。

mockitoのJavadocも、ネイティブタイプを処理するときintThatbooleanThatスタイルメソッドを使用するように言っていると確信しています。それらを使用すると、コンパイラーによって導入された自動アンボックス化コードを防ぐことができます。

別のトピックでは、読みやすくするために、そのようなコードを作成することをお勧めします。

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 に答える