gpt4 book ai didi

mockito - 使用 vert.x rxjava2 和 Mockito 模拟 http 响应

转载 作者:行者123 更新时间:2023-12-04 10:40:30 25 4
gpt4 key购买 nike

我正在玩 rxjava vert.x(版本 3.8.4)WebClient。我的客户将通过 Mockito(版本 3.2.4)调用一些服务,我正在测试它应该如何处理错误。以下是我如何模拟服务的响应:

...
JsonObject jsonResponse = new JsonObject();
HttpResponse<Buffer> httpResponse = Mockito.mock(HttpResponse.class);
Mockito.when(httpResponse.statusCode()).thenReturn(500);
Mockito.when(httpResponse.bodyAsJsonObject()).thenReturn(jsonResponse);
HttpRequest<Buffer> httpRequest = Mockito.mock(HttpRequest.class);
Mockito.when(httpRequest.rxSend()).thenReturn(Single.just(httpResponse));
return httpRequest;
...

Mockito.when(httpResponse.statusCode()).thenReturn(500); 被执行时我得到这个错误:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at my.dummy.project.ServiceHandlerTest.serviceRepliesWithA500Response(ServiceHandlerTest.java:70)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, which is not supported
3. you are stubbing the behaviour of another mock inside before 'thenReturn' instruction is completed
...

我在这里错过了什么?

最佳答案

我的建议是将 okhttp 的 MockWebServer 用于此类测试用例。

可以为每个测试实例化 MockWebserver,并允许您创建一个 web 服务 url,您的被测实现可以使用该 url 发送针对它的真实 http 请求。

在此之前,您可以定义一个模拟响应,该响应将由模拟网络服务器返回给您的实现。

我不知道您的测试用例,但这段代码应该清楚 MockWebServer 的工作原理。

更多示例和完整文档可以在 their github repo 找到.

正如您在下面看到的,您可以做出几个断言,例如。如果使用了正确的请求方法,触发了多少请求,以及在请求期间是否使用了正确的请求参数和正文。

    @ExtendWith(VertxExtension.class)
@Slf4j
public class WebServiceTest {

private WebServiceRequester sut;

private MockWebServer mockWebServer;

@BeforeEach
public void setUp() {
sut = new WebServiceRequester();
mockWebServer = new MockWebServer();
}

@Test
public void testCallService(final Vertx vertx, final VertxTestContext testContext) throws InterruptedException {
// given
final JsonObject requestPayload = new JsonObject().put("requestData", new JsonArray("[]"));
final JsonObject serverResponsePayload = new JsonObject().put("responseData", new JsonArray("[]"));
mockWebServer.enqueue(new MockResponse()
.setBody(serverResponsePayload.encode())
.setResponseCode(200)
.setHeader("content-type", "application/json"));

// when
final String webServiceUrl = mockWebServer.url("/").toString();
final Promise<String> stringPromise =
sut.callService(
webServiceUrl,
requestPayload,
vertx);

// then
final RecordedRequest recordedRequest = mockWebServer.takeRequest();
assertEquals("POST", recordedRequest.getMethod());
assertEquals("[text={\"request\":[]}]", recordedRequest.getBody().toString());
assertEquals(1, mockWebServer.getRequestCount());
testContext.assertComplete(stringPromise.future())
.map(val -> {
assertEquals("promise_completed", val);
testContext.completeNow();
return val;
})
.onComplete(onComplete -> {
assertTrue(onComplete.succeeded());
log.info("done");
})
.onFailure(onError -> Assertions.fail());

}
}

关于mockito - 使用 vert.x rxjava2 和 Mockito 模拟 http 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59957813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com