我有这个测试用例:
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
方法定义结果?
答案 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();
}