EasyMock称之为真正的方法

时间:2015-05-15 15:00:24

标签: java unit-testing easymock

我有这个测试用例:

TestClient的

@RunWith(EasyMockRunner.class)
public class TestClient extends EasyMockSupport {

    @TestSubject
    private final IClient client = new Client();

    @Mock
    private HttpClient httpClient;

    @Mock
    private HttpUriRequest request;
    @Mock
    private HttpResponse response;

    @Test
    public void testExecute() throws ClientProtocolException, IOException {
        expect(httpClient.execute(request)).andReturn(response);
        replayAll();
        httpClient.execute(request);
        client.execute(request);
        verifyAll();
    }
}

客户端

public class Client implements IClient {

    private final HttpClient httpClient;

    public Client() {
        httpClient = createDefaultClient();
    }

    private HttpClient createDefaultClient() {
        return HttpClientBuilder.create()
                .build();
    }

    @Override
    public HttpResponse execute(final HttpUriRequest request)
            throws IOException {
        return httpClient.execute(request);
    }

}

当我运行它时,我收到此错误:

Unexpected method call HttpUriRequest.getURI()

通常创建的不会调用此方法。

为什么我收到此错误?为什么要求我为getURI方法定义结果?

3 个答案:

答案 0 :(得分:2)

您必须从

中删除final
private final HttpClient httpClient;

否则,EasyMock无法使用自己的模拟实例覆盖httpClient。当然最好还是直接使用依赖注入,但这与你的实际问题相关。

可以使用reflection作为workaround;但亲爱的,我没有...

原始答案:

发布完整的堆栈跟踪以及Client类的相关部分将帮助我们与您一起调试。你提到:

  

client.execute(request)我做httpClient.execute(request)

但是(至少在您发布的代码中)client无法获得对模拟httpClient实例的引用。您的Client类是否可以构建它自己的HttpClient实例,并针对而不是您的模拟提出的请求?

如果是这样,您的Client应遵循dependency injection模式,并在构建时传入HttpClient实例,而不是在内部构建一个。

另一种可能性是,您的Client.execute()方法在某个时刻正在调用request.getURI(),在这种情况下,您只需要expect()拨打request.getURI()

答案 1 :(得分:0)

我怀疑方法changeimage内部有一个function changeimage(x){ var s = x.options[x.selectedIndex]; document.getElementById("mainproductpic").src = s.getAttribute("data-value1"); document.getElementById('ThumbImageOne').href = s.getAttribute("data-value1"); mynum = s.getAttribute("data-value2"); Shadowbox.open(document.getElementById('ThumbImageOne')); Shadowbox.change(mynum); } 语句(或深深埋藏在被调用的方法中)。 Easy Mock需要知道调用此方法时的响应。

答案 2 :(得分:0)

我怀疑问题是httpClient.execute(request);的召唤。尝试删除它。您已经通过httpClient设置了对expect(httpClient.execute(request)).andReturn(response);的期望。

@Test
public void testExecute() throws ClientProtocolException, IOException {
    expect(httpClient.execute(request)).andReturn(response);
    replayAll();
    client.execute(request);
    verifyAll();
}