如何模拟影响对象的void返回方法

我正在为我的应用程序编写unit testing,我想知道Mockito框架是否有可能影响传递给返回void模拟类的方法的对象。 例如,调用一个模拟的validation类,该类包含一个返回void但通过作为参数传入的对象跟踪各种更改和元数据的方法。 。

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

我为我的其他测试模拟了validation器类,但对于这个我需要模拟对cartItemsFilter对象的更改,我不知道该怎么做。

答案是肯定的,你可以,基于你的测试需要,基本上有两个级别。

如果您只想测试与模拟对象的交互,则可以使用verify()方法来validation是否调用了void方法。

如果你的测试真的需要模拟对象来修改传递给它的参数,你需要实现一个Answer

编辑以显示正确使用无效方法的答案

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

要添加到Kevin Welker的答案中,如果您的MyClass是一个自定义类,那么在其中定义一个equals / hashcode方法,以便Mockito可以使用它来精确匹配方法调用。

就我而言,“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)); 

ArgumentCaptor也可以提供帮助。

这是从这里找到的片段:

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