如何在Mockito中根据参数属性返回不同的值?

21

我测试的类接收一个客户端封装器:

被测试的类(片段)

private ClientWrapper cw
public Tested(ClientWrapper cw) {
    this.cw = cw;
}

public String get(Request request) {
    return cw.getClient().get(request);
}

测试初始化:

ClientWrapper cw = Mockito.mock(ClientWrapper.class);
Client client = Mockito.mock(Client.class);
Mockito.when(cw.getClient()).thenReturn(client);
//Here is where I want to alternate the return value:
Mockito.when(client.get(Mockito.any(Request.class))).thenReturn("100");
在这个例子中,我总是返回"100",但请求有一个属性id,我想根据request.getId()的值返回不同的值给client.get(Request)。 我该怎么做呢?
我始终返回"100",但是请求有一个属性id,我想根据request.getId()的值返回不同的值给client.get(Request) 。如何实现?
3个回答

42

你可以使用Mockito的答案,所以你可以像这样写:

Mockito.when(client.get(Mockito.any(Request.class))).thenReturn("100");

写:

Mockito.when(client.get(Mockito.any(Request.class)))
 .thenAnswer(new Answer() {
   Object answer(InvocationOnMock invocation) {
     Object[] args = invocation.getArguments();
     Object mock = invocation.getMock();
     return "called with arguments: " + args;
   }
});

9
您可以创建一个ArgumentMatcher来匹配id的Request
因此,参数匹配器将如下所示:

import org.mockito.ArgumentMatcher;

public class IsRequestWithId implements ArgumentMatcher<Request> {
    private final int id;

    public IsRequestWithId(int id) {
        this.id = id;
    }

    @Override
    public boolean matches(Object arg) {
        Request request = (Request)arg;
        return id == request.getId();
    }
}

然后你可以像这样使用它:

Mockito.when(client.get(Mockito.argThat(new IsRequestWithId(1)))).thenReturn("100");
Mockito.when(client.get(Mockito.argThat(new IsRequestWithId(2)))).thenReturn("200");

否则使用Answer也可以,但使用ArgumentMatcher可以让代码更加“声明式”。

哪个“Request”类呢?我似乎找不到具有“.getId()” getter的适当类。谢谢。 - jens
Request 是您正在尝试测试/模拟的类。 - John Montgomery

9
为了做到正确并且代码量最小,您需要使用ArgumentMatcher、lambda表达式,并不要忘记ArgumentMatcher lambda中对筛选器成员进行空检查(特别是如果您有多个使用相同ArgumentMatcher的模拟)。
定制化参数匹配器:
private ArgumentMatcher<Request> matchRequestId(final String target) {
    return request -> request != null &&
            target.equals(request.getId());
}

使用方法:

 given(client.get(argThat(matchRequestId("1")))).willReturn("100");
 given(client.get(argThat(matchRequestId("2")))).willReturn("200");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接