Mockito -我如何测试基于HttpStatusCode的行为?



我有这个请求与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

我遇到的问题是,我正在模拟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());```

考虑这样重写代码:

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()调用,这违背了使用响应式编程的目的。

您可以使用okhttp模拟您正在访问的服务器,如下所示:https://www.baeldung.com/spring-mocking-webclient

唯一的问题是,您必须在您试图测试的web客户端上使用.mutate()方法来编辑basurl以匹配模拟web服务器。在我自己的实现中,我使用getter和setter来修改web客户端baseurl,然后在测试结束时将其设置回原始值。

最新更新