使模拟方法返回传递给它的参数

2022-08-31 04:03:28

考虑一个方法签名,如:

public String myFunction(String abc);

Mockito 能否帮助返回与该方法收到的字符串相同的字符串?


答案 1

自 Mockito 1.9.5+ 和 Java 8+ 起

您可以使用 lambda 表达式,例如:

when(myMock.myFunction(anyString())).thenAnswer(i -> i.getArguments()[0]);

其中 是 的实例。iInvocationOnMock

对于旧版本

您可以在 Mockito 中创建答案。假设,我们有一个名为 MyInterface 的接口,其中包含一个方法 myFunction。

public interface MyInterface {
    public String myFunction(String abc);
}

以下是带有Mockito答案的测试方法:

public void testMyFunction() throws Exception {
    MyInterface mock = mock(MyInterface.class);
    when(mock.myFunction(anyString())).thenAnswer(new Answer<String>() {
    @Override
    public String answer(InvocationOnMock invocation) throws Throwable {
        Object[] args = invocation.getArguments();
        return (String) args[0];
    }
    });

    assertEquals("someString",mock.myFunction("someString"));
    assertEquals("anotherString",mock.myFunction("anotherString"));
}

答案 2

如果您使用的是Mockito 1.9.5或更高版本,则有一种新的静态方法可以为您制作对象。你需要写一些类似的东西Answer

import static org.mockito.Mockito.when;
import static org.mockito.AdditionalAnswers.returnsFirstArg;

when(myMock.myFunction(anyString())).then(returnsFirstArg());

或者

doAnswer(returnsFirstArg()).when(myMock).myFunction(anyString());

请注意,该方法在类中是静态的,这是Mockito 1.9.5的新功能;所以你需要正确的静态导入。returnsFirstArg()AdditionalAnswers


推荐