2012-09-14 127 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));