Как охватить сценарии ошибок WebFlux Webclient 4XX и 5XX с использованием макета MockitoJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как охватить сценарии ошибок WebFlux Webclient 4XX и 5XX с использованием макета Mockito

Сообщение Anonymous »


Я пытался охватить тестовые примеры веб-клиента для ответов об ошибках 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»