java - 我的mockito模拟如何使用更改的参数调用原始方法?

标签 java unit-testing mockito

我正在使用mockito模拟。

我想控制方法foo(String a, Date b)的调用

使用foo(a,fixed_date)调用原始方法

我如何使用mockito API来做到这一点?

MyObject myObject = mock(MyObject.class);

        when(myObject.foo(anyString, any(Date.class))
                .thenCallRealMethod();

为什么这不起作用?

它永远不会重定向调用

ImagesSorter imagesSorter = spy(new ImagesSorter());
        doReturn(imagesSorter.sortImages(images, user, fakeNowDate)).when(imagesSorter).sortImages(images,user);

最佳答案

我有一个解决方案,但它有点hacky,让我们假设foo的返回类型是String:

import static org.mockito.Mockito.when;
import static org.mockito.Mockito.mock;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;

...

final Date fixedDate = ...;

MyClass myObject = mock(MyClass.class);

when(myObject.foo(anyString(), any(Date.class))).thenAnswer(new Answer<String>() {
        public String answer(InvocationOnMock invocation) throws Throwable {
            // Switch the 2nd argument
            invocation.getArguments()[1] = fixedDate;
            // Then call the real method
            return (String) invocation.callRealMethod();
        }
    }); 

MyClass为例:

public class MyClass {

    public String foo(String s, Date d) {
        return s + d;
    }
}

编辑:

在您使用 ImageSorter 的最后一个示例中,我认为您不需要 Mockito,一个简单的装饰器就可以解决问题:

public interface ImageSorter {
    void sortImages(Images images, User user);

    void sortImages(Images images, User user, Date date);
}

public class ImageSorterDecorator implements ImageSorter {

    final ImageSorter delegate;
    final Date fixedDate;

    public ImageSorterDecorator (ImageSorter delegate, Date fixedDate){
        this.delegate = delegate;
        this.fixedDate = fixedDate;
    }

    public void sortImages(Images images, User user){
        delegate.sortImages(images, user, fixedDate);
    }

    public void sortImages(Images images, User user, Date date){
        delegate.sortImages(images, user, fixedDate);
    }
}

关于java - 我的mockito模拟如何使用更改的参数调用原始方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26122060/

相关文章:

java - Dozer 枚举到枚举映射

java - 交换字符串中的单词

c++ - 使用 googletest 识别类型参数化测试中使用的基类

java - 用EasyMock测试Observer的更新方法

java - Mockito 验证错误的重载方法

java - Mockito (Junit) 无法迭代 JSONArray 对象

java - Junit 测试 @InjectMocks 类中的异常

java - Java 命令提示符中的按键绑定(bind)?

java - 是否有可能以编程方式生成 JUnit 测试用例和套件?

java - 当调用 void 方法时,如何使用 PowerMock/PowerMockito/Mockito 抛出异常?