Как использовать mockito, чтобы сгенерировать HttpClientErrorException.Unauthorized error - PullRequest
1 голос
/ 06 февраля 2020

Я использую mockito, чтобы высмеивать мой authenticationService.getUserInfo метод.

Я испытываю трудности при попытке издеваться HttpClientErrorException.Unauthorized.

Я не могу просто новый HttpClientErrorException.Unauthorized.

Есть ли другой способ?

Реализация:

try {
    result = authenticationService.getUserInfo(accessToken);

} catch (HttpClientErrorException.Unauthorized e) {

    String errorMsg = "Invalid access token - " + e.getMessage();

    throw new InvalidAccessTokenException(errorMsg);
}

Контрольный пример:

@Test
public void givenInvalidToken_whenGetUserInfoThrows401Response_thenThrowInvalidAccessTokenExceptionAndFail() throws ServletException, IOException {

    HttpClientErrorException ex = new HttpClientErrorException(HttpStatus.UNAUTHORIZED);

    exceptionRule.expect(InvalidAccessTokenException.class);
    exceptionRule.expectMessage("Invalid access token - " + ex.getMessage());

    Mockito.when(authenticationService.getUserInfo(anyString())).thenThrow(ex);

    filter.doFilterInternal(this.request, this.response, this.mockChain);
}

Журналы ошибок из запущенного контрольного примера:

java.lang.AssertionError: 
Expected: (an instance of com.demo.security.common.exception.InvalidAccessTokenException and exception with message a string containing "Invalid access token - 401 UNAUTHORIZED")
     but: an instance of com.demo.security.common.exception.InvalidAccessTokenException <org.springframework.web.client.HttpClientErrorException: 401 UNAUTHORIZED> is a org.springframework.web.client.HttpClientErrorException
Stacktrace was: org.springframework.web.client.HttpClientErrorException: 401 UNAUTHORIZED

1 Ответ

1 голос
/ 06 февраля 2020

HttpClientErrorException.Unauthorized является дочерним исключением HttpStatusCodeException

public static final class HttpClientErrorException.Unauthorized
extends HttpClientErrorException

Поэтому, когда вы бросите HttpStatusCodeException, блок catch не будет выполнен, так как дочернее исключение не будет поймать родительское исключение.

Так что создайте HttpClientErrorException.Unauthorized и бросьте его

HttpClientErrorException http = HttpClientErrorException.Unauthorized.create(HttpStatus.UNAUTHORIZED, null, null, null, null);

Я также рекомендовал бы поймать HttpStatusCodeException, поскольку UNAUTHORIZED задано c до 401 и любые исключения серии 400 не будут пойманы UNAUTHORIZED. Вы также можете получить код состояния от HttpClientErrorException и проверить его, как показано в моем ответе

try {

result = authenticationService.getUserInfo(accessToken);

} catch (HttpClientErrorException e) {

if(e.getStatusCode().equals(HttpStatus.UNAUTHORIZED))
  //do something

String errorMsg = "Invalid access token - " + e.getMessage();

throw new InvalidAccessTokenException(errorMsg);
}
...