HTTP-запрос Mock to POST получает исключение нулевого указателя - PullRequest
0 голосов
/ 21 октября 2018

У меня есть этот метод

public HTTPResult post(String url, String requestBody) throws Exception {
    return HTTPPostPut(url, requestBody, HttpMethod.POST);
}

public HTTPResult HTTPPostPut(String url, String requestBody,HttpMethod httpMethod) throws Exception {
    MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
    headers.add("content-type","application/json");
    HttpEntity requestEntity = new HttpEntity(requestBody,headers);

    try {
        ResponseEntity<String> response = this.restTemplate.exchange(url, httpMethod, requestEntity, String.class);
        return new HTTPResult((String) response.getBody(), response.getStatusCode().value());
    } catch (ResourceAccessException var8) {
        String responseBody = var8.getCause().getMessage();
        JSONObject obj = new JSONObject(responseBody);
        return new HTTPResult(obj.getString("responseBody"), Integer.parseInt(obj.getString("statusCode")));
    }
}

, который я создал для этого макета и получаю исключение нулевого указателя:

public void testPost() throws Exception{
    MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
    headers.add("content-type","application/json");
    HttpEntity requestEntity = new HttpEntity("{blbl}",headers);

    ResponseEntity<String> response = new ResponseEntity("{blbl}",  HttpStatus.OK);

    RestTemplate mockRestTemplate = mock(RestTemplate.class);

    when(mockRestTemplate.exchange(baseUrl, HttpMethod.POST, requestEntity, String.class)).thenReturn(response);

    RestAPI api = new RestAPI(mockRestTemplate);

    HTTPResult res = null;
    try {
        res = api.post(baseUrl,"{blbl}");
    } catch (IOException e) {
        e.printStackTrace();

    }

    assertEquals(res.getResponseBody(), "{blbl}");
    assertEquals(res.getStatusCode(), HttpStatus.OK.value());
}

Я получаю исключение нулевого указателя при вызове:

res = api.post(baseUrl,"{blbl}");

Это потому, что ответ нулевой.

1 Ответ

0 голосов
/ 21 октября 2018

Используйте сопоставление аргументов, когда упорядочивает макет, поскольку экземпляр, передаваемый в смоделированную зависимость, отличается от того, что передается при выполнении теста.

Это приведет к тому, что макет вернет нулевой ответ, так как ожидаемые экземпляры не совпадают

Рефакторинг теста

public void testPost() throws Exception {
    //Arrange
    String expected = "{blbl}";
    ResponseEntity<String> response = new ResponseEntity(expected,  HttpStatus.OK);    

    RestTemplate mockRestTemplate = mock(RestTemplate.class);

    when(mockRestTemplate.exchange(eq(baseUrl), eq(HttpMethod.POST), any(HttpEntity.class), eq(String.class)))
        .thenReturn(response);

    RestAPI api = new RestAPI(mockRestTemplate);

    //Act
    HTTPResult res = api.post(baseUrl, expected);

    //Assert
    assertEquals(res.getResponseBody(), expected);
    assertEquals(res.getStatusCode(), HttpStatus.OK.value());
}

Обратите внимание на использование сопоставителя any(HttpEntity.class), который будетпозволяют переданному HttpEntity быть сопоставленным при вызове.

Поскольку использование аргументов соответствует ни одному или всем, для оставшихся константных аргументов используется соответствие eq().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...