2012-09-14 45 views
10

我寫單元測試我的應用程序,我想知道是否有可能爲的Mockito框架影響傳遞到一個返回嘲笑類的空洞對象的方法。例如,調用包含返回無效,但通過傳遞作爲參數的對象跟蹤的各種改變和元數據的方法的嘲笑驗證類。 。如何嘲笑void返回方法影響對象

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

我嘲笑了驗證器類爲我的其他測試,但是這一個我需要嘲笑更改cartItemsFilter對象,我不知道該怎麼辦。

回答

18

答案是肯定的,就可以了,基本上有兩個層次做這個的,根據需要您的測試。

如果你只是想用嘲笑的對象來測試的互動,你可以簡單地使用verify()方法,以驗證無效方法被調用。

如果測試真正需要的嘲笑對象修改傳遞給它的參數,你將需要實現一個Answer

EDITED表明使用回答與無效方法的適當形式

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

ArgumentCaptor也可能有所幫助。

下面是here找到一個片段:

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

這並不能解決操作問題,他需要實現一個答案 – iwein

1

要添加到凱文·韋爾克的回答, 如果你的MyClass的是一個自定義類,然後在它定義的equals/hashCode方法,這樣的Mockito可以使用它完全匹配方法調用。

在我的情況下,「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));