Как охватить сценарии ошибок WebFlux Webclient 4XX и 5XX с использованием макета Mockito ⇐ JAVA
Как охватить сценарии ошибок WebFlux Webclient 4XX и 5XX с использованием макета Mockito
Я пытался охватить тестовые примеры веб-клиента для ответов об ошибках 4xx и 5xx, используя макет Mockito, но не смог их охватить.
Ниже приведен метод, который пытается охватить:
public Mono getAzureToken() { log.info("Получение токена Azure"); AtomicReference startTime = новый AtomicReference(); if (expiresAt != null && !this.isTokenExpired()) { вернуть Mono.just(this.token); } вернуть webClient.post().uri(serviceProperties.getAzureTokenUri()) .body(BodyInserters.fromFormData(CLIENT_ID, serviceProperties.getClientId()) .with(CLIENT_SECRET, serviceProperties.getClientSecret()) .with(GRANT_TYPE, CLIENT_CREDENTIALS)) .забрать() .onStatus(HttpStatusCode::is4xxClientError, (clientResponse -> clientResponse.bodyToMono(Map.class) .flatMap(соответственно -> { Строка serviceResponse = (соответственно!= null)? соотв.toString(): ПУСТОЙ; журнал.ошибка( """ Исключение (is4xxClientError) произошло при получении токена Azure \ Возвращенный код ответа [{}], ответ от Azure \ услуга {} \ """, clientResponse.statusCode(), сервисОтвет); вернуть Mono.error( новое serviceException(ApiErrorCode.POST_AZURE_SERVICE_ERROR, serviceResponse, clientResponse.statusCode(), ServiceCodes.AZURE_SERVICE_CODE)); }))) .onStatus(HttpStatusCode::is5xxServerError, (clientResponse -> clientResponse.bodyToMono(Map.class) .flatMap(соответственно -> { Строка serviceResponse = (соответственно!= null)? соотв.toString(): ПУСТОЙ; журнал.ошибка( """ Исключение (is5xxServerError) произошло при получении токена Azure \ Возвращенный код ответа {}, ответ от Azure \ услуга {} \ """, clientResponse.statusCode(), сервисОтвет); вернуть Mono.error( новое serviceException(ApiErrorCode.POST_AZURE_SERVICE_ERROR, serviceResponse, clientResponse.statusCode(), ServiceCodes.AZURE_SERVICE_CODE)); }))) .bodyToMono(Map.class).map(ответ -> { this.token = (String)response.get("access_token"); log.debug("accessToken " + токен); long expiresIn = Long.valueOf((String) response.get("expires_on")); this.expiresAt = новая дата (expiresIn * 1000); log.debug(" Срок действия истекает:" + expiresAt); вернуть токен; }) .timeout(Duration.ofMillis(serviceProperties.getAzureTimeoutValueInMillis())) .contextCapture() .onErrorResume(e -> { log.error(""" Произошла ошибка при вызове Azure для получения токена \ Исключение: {}, stackTrace: {}, Сообщение {}\ """, e.getStackTrace(), ExceptionUtils.getStackTrace(e), StringUtil.encodeCRLF(e.getMessage())); вернуть Mono.error(e); }).doOnSubscribe(x -> startTime.set(System.nanoTime())) .doFinally(x -> { окончательный длинный milliSecTaken = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime.get()); log.info("Время, затраченное на вызов токена Azure -> : {} миллисекунд.", milliSecTaken); }); } Тестовый пример, как показано ниже
@ExtendWith(MockitoExtension.class) публичный класс MyCloudServiceCallerTest {
@Mock частный веб-клиент webClientMock; @InjectMocks MyCloudServiceCaller myCloudServiceCaller; @MockBean частный ObservationRegistry ObserveRegistry; @Насмехаться частный WebClient.RequestBodyUriSpec requestBodyUriSpecMock; @Насмехаться частный WebClient.RequestHeadersUriSpec requestHeadersUriSpecMock; @Насмехаться частный WebClient.RequestHeadersSpec requestHeadersSpecMock; @Насмехаться частный CustomMinimalForTestResponseSpec responseSpecMock; @Насмехаться serviceProperties serviceProperties; @Тест void mustFailsWhenHttpStatus5xx() { When(serviceProperties.getAzureTokenUri()).thenReturn("https://login.microsoftonline.com/ghsgg ... uth2/token"); когда(serviceProperties.getClientId()).thenReturn("SomeClientId"); когда(serviceProperties.getClientSecret()).thenReturn("SomeSecret"); //данный когда (webClientMock.post()).thenReturn (requestBodyUriSpecMock); когда (requestBodyUriSpecMock.uri (anyString ())) .thenReturn(requestBodyUriSpecMock); когда (requestBodyUriSpecMock.body (любой ())).thenReturn (requestHeadersSpecMock); когда (requestHeadersSpecMock.retrieve()).thenReturn (responseSpecMock); когда (responseSpecMock.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR); когда (responseSpecMock.onStatus(любой(Predicate.class), любой(Function.class))).thenCallRealMethod(); //когда + Тогда Mono result = myCloudServiceCaller.getAzureToken(); StepVerifier.create(результат) .expectNext("новыйТокен") .verifyComplete(); } абстрактный класс CustomMinimalForTestResponseSpec реализует WebClient.ResponseSpec { публичный абстрактный HttpStatus getStatus(); public WebClient.ResponseSpec onStatus(Predicate statusPredicate, Function
Я пытался охватить тестовые примеры веб-клиента для ответов об ошибках 4xx и 5xx, используя макет Mockito, но не смог их охватить.
Ниже приведен метод, который пытается охватить:
public Mono getAzureToken() { log.info("Получение токена Azure"); AtomicReference startTime = новый AtomicReference(); if (expiresAt != null && !this.isTokenExpired()) { вернуть Mono.just(this.token); } вернуть webClient.post().uri(serviceProperties.getAzureTokenUri()) .body(BodyInserters.fromFormData(CLIENT_ID, serviceProperties.getClientId()) .with(CLIENT_SECRET, serviceProperties.getClientSecret()) .with(GRANT_TYPE, CLIENT_CREDENTIALS)) .забрать() .onStatus(HttpStatusCode::is4xxClientError, (clientResponse -> clientResponse.bodyToMono(Map.class) .flatMap(соответственно -> { Строка serviceResponse = (соответственно!= null)? соотв.toString(): ПУСТОЙ; журнал.ошибка( """ Исключение (is4xxClientError) произошло при получении токена Azure \ Возвращенный код ответа [{}], ответ от Azure \ услуга {} \ """, clientResponse.statusCode(), сервисОтвет); вернуть Mono.error( новое serviceException(ApiErrorCode.POST_AZURE_SERVICE_ERROR, serviceResponse, clientResponse.statusCode(), ServiceCodes.AZURE_SERVICE_CODE)); }))) .onStatus(HttpStatusCode::is5xxServerError, (clientResponse -> clientResponse.bodyToMono(Map.class) .flatMap(соответственно -> { Строка serviceResponse = (соответственно!= null)? соотв.toString(): ПУСТОЙ; журнал.ошибка( """ Исключение (is5xxServerError) произошло при получении токена Azure \ Возвращенный код ответа {}, ответ от Azure \ услуга {} \ """, clientResponse.statusCode(), сервисОтвет); вернуть Mono.error( новое serviceException(ApiErrorCode.POST_AZURE_SERVICE_ERROR, serviceResponse, clientResponse.statusCode(), ServiceCodes.AZURE_SERVICE_CODE)); }))) .bodyToMono(Map.class).map(ответ -> { this.token = (String)response.get("access_token"); log.debug("accessToken " + токен); long expiresIn = Long.valueOf((String) response.get("expires_on")); this.expiresAt = новая дата (expiresIn * 1000); log.debug(" Срок действия истекает:" + expiresAt); вернуть токен; }) .timeout(Duration.ofMillis(serviceProperties.getAzureTimeoutValueInMillis())) .contextCapture() .onErrorResume(e -> { log.error(""" Произошла ошибка при вызове Azure для получения токена \ Исключение: {}, stackTrace: {}, Сообщение {}\ """, e.getStackTrace(), ExceptionUtils.getStackTrace(e), StringUtil.encodeCRLF(e.getMessage())); вернуть Mono.error(e); }).doOnSubscribe(x -> startTime.set(System.nanoTime())) .doFinally(x -> { окончательный длинный milliSecTaken = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTime.get()); log.info("Время, затраченное на вызов токена Azure -> : {} миллисекунд.", milliSecTaken); }); } Тестовый пример, как показано ниже
@ExtendWith(MockitoExtension.class) публичный класс MyCloudServiceCallerTest {
@Mock частный веб-клиент webClientMock; @InjectMocks MyCloudServiceCaller myCloudServiceCaller; @MockBean частный ObservationRegistry ObserveRegistry; @Насмехаться частный WebClient.RequestBodyUriSpec requestBodyUriSpecMock; @Насмехаться частный WebClient.RequestHeadersUriSpec requestHeadersUriSpecMock; @Насмехаться частный WebClient.RequestHeadersSpec requestHeadersSpecMock; @Насмехаться частный CustomMinimalForTestResponseSpec responseSpecMock; @Насмехаться serviceProperties serviceProperties; @Тест void mustFailsWhenHttpStatus5xx() { When(serviceProperties.getAzureTokenUri()).thenReturn("https://login.microsoftonline.com/ghsgg ... uth2/token"); когда(serviceProperties.getClientId()).thenReturn("SomeClientId"); когда(serviceProperties.getClientSecret()).thenReturn("SomeSecret"); //данный когда (webClientMock.post()).thenReturn (requestBodyUriSpecMock); когда (requestBodyUriSpecMock.uri (anyString ())) .thenReturn(requestBodyUriSpecMock); когда (requestBodyUriSpecMock.body (любой ())).thenReturn (requestHeadersSpecMock); когда (requestHeadersSpecMock.retrieve()).thenReturn (responseSpecMock); когда (responseSpecMock.getStatus()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR); когда (responseSpecMock.onStatus(любой(Predicate.class), любой(Function.class))).thenCallRealMethod(); //когда + Тогда Mono result = myCloudServiceCaller.getAzureToken(); StepVerifier.create(результат) .expectNext("новыйТокен") .verifyComplete(); } абстрактный класс CustomMinimalForTestResponseSpec реализует WebClient.ResponseSpec { публичный абстрактный HttpStatus getStatus(); public WebClient.ResponseSpec onStatus(Predicate statusPredicate, Function
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Выполнение StackOverflowError при использовании retryWhen с WebFlux WebClient
Anonymous » » в форуме JAVA - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-