Junit无法返回模拟的响应并返回null

时间:2020-05-13 19:09:39

标签: unit-testing junit mockito powermockito

我是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响应(即使已被模拟)

1 个答案:

答案 0 :(得分:0)

您对client.doRequest进行如下模拟:

Mockito.when(client.doRequest(webReq)).thenReturn(this.webResponse);

但是您要在测试的服务中创建WebRequest的新实例。

您用不同于测试中记录的参数调用doRequest。 将参数与相等进行比较。 WebRequest很可能不会覆盖均等值,因此记录的交互将被忽略,并且默认响应(空)将被重新发送。

我想WebResuest可能不是您拥有的代码(您尚未在问题中指定此代码),因此可能无法覆盖它。

因此,您可以使用其他参数匹配器。 您可以使用ArgumentMatchers.any()作为良好的开端,也可以实现自定义参数匹配器。