Mockito:返回传递的参数

Mockito: returning the passed parameter

我有一个模拟对象:

HttpUriRequest request = Mockito.mock(HttpUriRequest.class);

我的代码调用

request.setHeader(key, value);

如何在调用getFirstHeader()方法时mockreturnvalue

request.getFirstHeader(key).getValue();

其中 key 和预期的 return value 是来自 setHeader 调用的参数?

request.getFirstHeader(key) returns 一个 Header 类型的对象,它有一个方法 getValue()

这是一个代码,我认为对您来说是一个很好的提示。

import org.junit.*;
import org.mockito.Mockito;

/**
 * Created by soroosh on 1/26/15.
 */
public class MockitoTest {
    @org.junit.Test
    public void ttt(){
        class  HttpUriRequest{
            public String getFirstHeader(){
                return "Header";
            }
        }
        HttpUriRequest request = Mockito.mock(HttpUriRequest.class);
        Mockito.when(request.getFirstHeader()).thenReturn("yoohoo");
        System.out.println(request.getFirstHeader());

    }
}

如果代码无法帮助您,请告诉我

或者,您可能希望 'spy' 在真实对象上而不是模拟它。

HttpGet request = Mockito.spy(new HttpGet("/"));
request.setHeader(key, value);

Mockito.verify(request).getFirstHeader(key);

我找到了解决我自己问题的方法:

    final MutableWrapper<String> stringWrapper = new MutableWrapper<>();
    Mockito.doAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            stringWrapper.wrap(invocation.getArgumentAt(1, String.class));
            return null;
        }
    }).when(request).setHeader(Matchers.eq(HEADER), Matchers.anyString());

    Mockito.doAnswer(new Answer<Header>() {
        @Override
        public Header answer(InvocationOnMock invocation) throws Throwable {
            Header header = Mockito.mock(Header.class);
            Mockito.when(header.getValue()).thenReturn(stringWrapper.unwrap());
            return header;
        }
    }).when(request).getFirstHeader(Matchers.eq(HEADER));
    return request;
}