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

tam*_*ren 13 java mockito

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

public GetCartItemsOutput getCartItems(GetCartItemsInput getCartItemsInput) {
    CartItemsFilter cartItemsFilter = new CartItemsFilter();
    validator.validateCartItemsInput(getCartItemsInput, cartItemsFilter); ...
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*ker 24

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

如果您只想测试与模拟对象的交互,则可以简单地使用该verify()方法来验证是否调用了void方法.

如果你的测试真的需要模拟对象来修改传递给它的参数,你需要实现一个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();
Run Code Online (Sandbox Code Playgroud)


Jay*_*ani 5

要补充 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));
Run Code Online (Sandbox Code Playgroud)