21

私は自分のアプリケーションの単体テストを書いていますが、Mockitoフレームワークが、モックされたクラスのvoidを返すメソッドに渡されるオブジェクトに影響を与える可能性があるかどうか疑問に思いました。たとえば、voidを返すが、引数として渡されたオブジェクトを介してさまざまな変更とメタデータを追跡するメソッドを含むモック検証クラスを呼び出します。。

public GetCartItemsOutput getCartItems(GetCartItemsInput getCartItemsInput) {
    CartItemsFilter cartItemsFilter = new CartItemsFilter();
    validator.validateCartItemsInput(getCartItemsInput, cartItemsFilter); ...

他のテスト用にバリデータークラスをモックしましたが、このテストでは、実行方法がわからないcartItemsFilterオブジェクトへの変更をモックする必要があります。

4

3 に答える 3

37

答えは「はい」です。テストの必要性に基づいて、これを行うには基本的に2つのレベルがあります。

モックオブジェクトとの相互作用をテストしたいだけの場合は、verify()メソッドを使用して、voidメソッドが呼び出されたことを確認できます。

テストで、渡されたパラメーターを変更するためにモックオブジェクトが本当に必要な場合は、Answer:を実装する必要があります。

ボイドメソッドでAnswerを使用する適切な形式を示すように編集

doAnswer(new Answer() {
    @Override
    Object answer(InvocationOnMock invocation) {
        Object[] args = invocation.getArguments();
        ((MyClass)args[0]).myClassSetMyField(NEW_VALUE);
        return null; // void method, so return null
    }
}).when(mock).someMethod();

Java 8以降では、上記はラムダで簡略化されています。

doAnswer(invocation-> {
    Object[] args = invocation.getArguments();
    ((MyClass)args[0]).myClassSetMyField(NEW_VALUE);
    return null;
}).when(mock).someMethod();
于 2012-09-14T17:42:14.190 に答える
5

Kevin Welkerの答えに追加するには、MyClassがカスタムクラスの場合、Mockitoがそれを使用してメソッド呼び出しに正確に一致できるように、equals/hashcodeメソッドを定義します。

私の場合、「MyClass」はサードパーティのAPIに含まれていたため、以下のように「any」メソッドを使用する必要がありました。

 doAnswer(new Answer() {
    Object answer(InvocationOnMock invocation) {
        Object[] args = invocation.getArguments();
        ((MyClass)args[0]).myClassSetMyField(NEW_VALUE);
        return null; // void method, so return null
    }
}).when(mock).someMethod(any(MyClass.class));
于 2016-01-15T06:10:11.440 に答える
-1

ArgumentCaptorも役立つ場合があります。

ここから見つかったスニペットは次のとおりです。

  ArgumentCaptor<GetCartItemsInput > argument = ArgumentCaptor.forClass(GetCartItemsInput .class);
  verify(mock).getCartItems(argument.capture());
  assertEquals(cartItemsFilter, argument.getValue());
于 2012-09-16T07:17:05.387 に答える