gpt4 book ai didi

java - 为此方法编写单元测试用例返回 RxJava Future

转载 作者:行者123 更新时间:2023-12-01 18:45:56 25 4
gpt4 key购买 nike

任何人都可以帮我为返回 RxJava Future 对象的方法编写一个单元测试用例,我能够为返回 Single 的方法编写和模拟。

public Future<JsonObject> fetchVendorDetailsVendorIdAsFuture(String serviceURI, Map<String, String> headerMap) {


if(vbConnectorCircuitBreaker == null){
vbConnectorCircuitBreaker= CircuitBreakers.getVbConnectorCircuitBreaker();
}
return vbConnectorCircuitBreaker.execute(future -> {
// get ok http client
OkHttpClient client = okHTTPClientHelper.getOkHTTPClient();

if(client != null){
try{
MediaType mediaType = MediaType.parse("application/json");
Headers headers = Headers.of(headerMap);
Request request = new Request.Builder()
.url(serviceURI)
.get()
.headers(headers)
.build();

Call call = client.newCall(request);
call.enqueue(new Callback() {
public void onResponse(Call call, Response response)
throws IOException {
String jsonData = response.body().string();
JsonObject jsonObject = new JsonObject(jsonData);
future.complete(jsonObject);
}

public void onFailure(Call call, IOException e) {

future.complete(null);
}
});
} catch(Exception exception) {

future.complete(null);
}
} else {
future.complete(null);
}
});
}

最佳答案

您可以尝试使用okhttp的MockWebServer。

这样,您的 Call 就可以发出真正的 http 请求,并且您将能够处理服务器的响应。

您可以使用 mockWebServer.enqueue(new MockResponse() ... ) 自己创建模拟服务器的响应

有很多不同的方法可以为此类问题编写测试,这是我的建议:

import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import okhttp3.mockwebserver.RecordedRequest;

// other imports omitted

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


private VendorDetailsVerticle sut;

private MockWebServer mockWebServer;

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

@Test
public void testExecuteService(final Vertx vertx, final VertxTestContext testContext)
throws InterruptedException {

// given -----
final JsonObject serverResponsePayload = new JsonObject().put("futureCompleted", true);
mockWebServer.enqueue(new MockResponse()
.setBody(serverResponsePayload.encode())
.setResponseCode(200)
.setHeader("content-type", "application/json"));

// when -----
final Future<JsonObject> jsonObjectFuture =
sut.fetchVendorDetailsVendorIdAsFuture(mockWebServer.url("/").toString(), new HashMap<>());

// then -----
final RecordedRequest recordedRequest = mockWebServer.takeRequest();
assertEquals("GET", recordedRequest.getMethod());
assertEquals(1, mockWebServer.getRequestCount());
testContext.assertComplete(jsonObjectFuture)
.map(val -> {
assertEquals("{'futureCompleted': true}", val.encode());
testContext.completeNow();
return val;
})
.onComplete(onComplete -> {
assertTrue(onComplete.succeeded());
log.info("done");
})
.onFailure(onError -> Assertions.fail());

}
}

这个测试当然需要一些定制才能在您的项目中运行,但我希望它能够提供有关如何测试 RxJava future 的图片。

关于java - 为此方法编写单元测试用例返回 RxJava Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59840660/

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