0

任何人都可以帮我为这个返回 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);
        }
    });
}
4

1 回答 1

0

您可以尝试使用 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 未来的图片。

于 2020-01-22T10:06:17.760 回答