2012-09-14 10 views
10

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

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

私は私の他のテストのためではなく、私は私が行う方法がわからないcartItemsFilterオブジェクトへの変更を必要とするモックこのいずれかのバリデータクラスを嘲笑。

答えて

18

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

模擬オブジェクトとのやりとりをテストするだけの場合は、単にverify()メソッドを使用して、voidメソッドが呼び出されたことを確認できます。空の方法で

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(); 
+0

感謝。 "((MyClass)args [0])myClassSetMyField(NEW_VALUE);"と頭を抱くようにしばらくしていましたが、最終的には私が嘲笑したメソッドに渡した引数のパラメータを設定することでした。再び、ty。 – tamuren

0
を回答を使用しての適切なフォームを表示する

EDITED

テストは本当にそれに渡されたパラメータを変更するには嘲笑のオブジェクトを必要とする場合は、あなたがAnswerを実装する必要があります

ArgumentCaptorも役に立ちます。ここで

here見つかり抜粋です:

ArgumentCaptor<GetCartItemsInput > argument = ArgumentCaptor.forClass(GetCartItemsInput .class); 
    verify(mock).getCartItems(argument.capture()); 
    assertEquals(cartItemsFilter, argument.getValue()); 
+1

これはopの問題を解決しません、彼は答えを実装する必要があります – iwein

1

あなたのMyClassのは、カスタムクラスであればMockitoはそれを使用することができるように、そして、それに等しい/ hashCodeメソッドを定義ケビン・ウェルカーの答え、 に追加するにはメソッド呼び出しと正確に一致するようにします。私の場合は

、「任意の」以下のように「MyClassのは、」サードパーティのAPIにあったので、私はこの方法を使用する必要がありました - あなたの助けのための

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)); 
関連する問題