我是Mockito的新手,试图模拟Web服务响应,但确实在某种程度上尝试了模拟,但很少有Objects可以工作,但是最终模拟的WebResponse始终返回null。
我要测试的服务方法:getWebResponse方法
public WebResponse getWebResponse(String crmNumber) throws JSONException, ExecutionException, WebException {
Map<String, String> HEADERS_POST = new HashMap<String, String>() {
{
put(WebUtil.HEADER_CONTENT, WebUtil.CONTENT_JSON);
put(WebUtil.HEADER_ACCEPT, WebUtil.CONTENT_JSON);
}
};
JSONObject requestJson = new JSONObject();
requestJson.put("crmNumber", crmNumber);
requestJson.put("application", "ABCD");
requestJson.put("feature", "DDDFL");
// Using internal web service becuase device authentication is done separately.
String url = CommonUtil.getServiceBaseUrl(true) + "/ett";
WebServiceClient client = WebServiceClientRegistry.getClient(ApacheCustom.class);
WebRequest webReq = new GenericWebRequest(WebRequestMethod.POST, url, HEADERS_POST, requestJson.toString());
// Till here i m getting all mocked object (client also Mocked) after this stament the webRes is returning null;
WebResponse webRes = client.doRequest(webReq);
return webRes;
}
这里是测试方法:
@Test
public void getWebResponseTest() {
mockStatic(CommonUtil.class);
mockStatic(WebServiceClientRegistry.class);
this.webResponse = new GenericWebResponse(200, "", new HashMap(), "");
try {
Mockito.when(CommonUtil.getServiceBaseUrl(true)).thenReturn("https://stage.com/service");
WebRequest webReq = new GenericWebRequest(WebRequestMethod.POST, "https://stage.com/service", new HashMap(), "");
Mockito.when(WebServiceClientRegistry.getClient(ApacheCustom.class)).thenReturn(client);
Mockito.when(client.doRequest(webReq)).thenReturn(this.webResponse);
WebResponse wesponse = this.ServiceResponse.getWebResponse("Number");
Assert.assertEquals(wesponse.getStatusCode(), 200);
} catch (Exception e) {
Assert.fail();
}
}
但是Test类的getWebResonse方法始终返回null响应(即使已被模拟)
答案 0 :(得分:0)
您对client.doRequest
进行如下模拟:
Mockito.when(client.doRequest(webReq)).thenReturn(this.webResponse);
但是您要在测试的服务中创建WebRequest的新实例。
您用不同于测试中记录的参数调用doRequest。 将参数与相等进行比较。 WebRequest很可能不会覆盖均等值,因此记录的交互将被忽略,并且默认响应(空)将被重新发送。
我想WebResuest可能不是您拥有的代码(您尚未在问题中指定此代码),因此可能无法覆盖它。
因此,您可以使用其他参数匹配器。
您可以使用ArgumentMatchers.any()
作为良好的开端,也可以实现自定义参数匹配器。