mockito 模拟WebClient发布方法失败

6kkfgxo0  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(168)

我可以找到几个关于模仿WebClient对象的问题。但是当我写一个有正文和多个头值的帖子时,我仍然有问题。我只是在使用Mockito。

public Boolean addNote(AlarmModel model) {
        ServiceDTO dto = mapper(model);

        return webClient.post()
                .uri("/service/api/addNotes")
                .headers(getHttpHeaders(dto.getHeader()))
                .accept(MediaType.APPLICATION_JSON)
                .body(Mono.just(dto.getBody()), ServiceBodyDTO.class)
                .retrieve()
                .onStatus(HttpStatus::is5xxServerError, this::handleStatusCodeError)
                .onStatus(HttpStatus::is4xxClientError, this::handleStatusCodeError)
                .bodyToMono(Boolean.class)
                .block();
    }

而这就是我是如何嘲笑post方法的行为的。

when(webClientMock.post()).thenReturn(requestBodyUriMock);
        when(requestBodyUriMock.uri(anyString())).thenReturn(requestBodyMock);

        when(requestHeadersMock.headers(any())).thenReturn(requestHeadersMock);

        when(requestBodyMock.accept(any())).thenReturn(requestBodyMock);
        when(requestBodyMock.contentType(any())).thenReturn(requestBodyMock);
        when(requestBodyMock.bodyValue(any())).thenReturn(requestHeadersMock);
        when(requestHeadersMock.retrieve()).thenReturn(responseMock);
        when(responseMock.bodyToMono(Boolean.class))
                .thenReturn(Mono.just(true));

但是,当我执行这个测试用例时,它在具有***retrieve()***的行失败,异常是java.lang.NullPointerException
我错过什么了吗?TIA。

irlmq6kh

irlmq6kh1#

同意@Martin的评论,* 单元测试webclient的ROI非常低。*
我推荐WireMock,它为测试Web客户端提供了非常好的API。

stubFor(post("/service/api/addNotes")
        .withHeader(HttpHeaders.ACCEPT, containing(MediaType.APPLICATION_JSON_VALUE))
        .willReturn(aResponse()
                .withStatus(200)
                .withBody("true")
        )
);

StepVerifier.create(service.addNote(note))
        .expectNextCount(1)
        .verifyComplete();

通过提供不同的存根,您可以轻松地测试积极和消极的场景

stubFor(post("/service/api/addNotes")
        .withHeader(HttpHeaders.ACCEPT, containing(MediaType.APPLICATION_JSON_VALUE))
        .willReturn(aResponse()
                .withStatus(500)
        )
);

使用Scenarios测试重试逻辑或甚至使用Delays模拟超时
每秒
我不确定为什么要使用block,但我的示例使用StepVerifier,并假定addNote返回Mono<Boolean>

vxqlmq5t

vxqlmq5t2#

这就是对我有效的,和你的没有太大的不同。你可能想比较和反馈:)

@Mock
private WebClient webClient;

@Mock
WebClient.RequestBodyUriSpec requestBodyUriSpec;

@SuppressWarnings("rawtypes")
@Mock
WebClient.RequestHeadersSpec requestHeadersSpec;

@Mock
WebClient.RequestBodySpec requestBodySpec;

@Mock
WebClient.ResponseSpec responseSpec;

given(getWebClient()).willReturn(webClient);
given(webClient.post()).willReturn(requestBodyUriSpec);
given(requestBodyUriSpec.uri(anyString())).willReturn(requestBodySpec);
given(requestBodySpec.headers(any())).willReturn(requestBodySpec);      
given(requestBodySpec.contentType(any())).willReturn(requestBodySpec);
given(requestBodySpec.accept(any())).willReturn(requestBodySpec);
given(requestBodySpec.bodyValue(any())).willReturn(requestHeadersSpec);
given(requestHeadersSpec.retrieve()).willReturn(responseSpec);

相关问题