我有這個請求WebClient:
webClient
.get()
.uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.<Optional<ByteArrayResource>>exchangeToMono(response -> {
if (response.statusCode().equals(HttpStatus.NOT_FOUND)) {
return Mono.just(Optional.empty());
}
return response.bodyToMono(ByteArrayResource.class).map(Optional::of);
})
.block();
如何測驗里面的邏輯exchangeToMono()?
我正在使用 Mockito 以這種方式進行測驗:
given(headersSpecHeadOpMock.exchangeToMono()).willReturn(Mono.just(clientResponse))
但這里的問題是,這樣我就不會測驗HttpStatus.NOT_FOUND.
uj5u.com熱心網友回復:
我遇到的問題是我在模擬 ClientResponse,但我必須模擬一個Function<ClientResponse, ? extends Mono<Optional<ByteArrayResource>>>.
解決方案是使用ArgumentCaptor來獲取引數,然后像這樣斷言他的值:
ArgumentCaptor 宣告:
ArgumentCaptor<Function<ClientResponse, ? extends Mono<Optional<ByteArrayResource>>>> captorLambda = ArgumentCaptor.forClass(Function.class);
捕獲引數:
given(headersSpecGetOpMock.<Optional<ByteArrayResource>>exchangeToMono(captorLambda.capture())).willReturn(Mono.just(Optional.empty()));
斷言客戶端回應回傳的值:
assertThat(captorLambda.getValue().apply(clientResponse).block()).isEqualTo(Optional.empty());```
uj5u.com熱心網友回復:
考慮如下重寫您的代碼:
webClient
.get()
.uri(uri)
.accept(MediaType.APPLICATION_OCTET_STREAM)
.retrive()
.onStatus(status -> HttpStatus.NOT_FOUND == status, response -> Mono.just(Optional.empty()))
.bodyToMono(ByteArrayResource.class);
.map(Optional::of)
.block();
現在您可以模擬retrieve()方法來輕松測驗您的條件。
作為旁注,請考慮block()掛斷電話,這違背了使用反應式編程的目的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/329759.html
