簡體   English   中英

為這個返回 RxJava Future 的方法編寫單元測試用例

[英]write unit test case for this method returning RxJava Future

任何人都可以幫我為這個返回 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() ... )自己創建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 的未來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM