написать тестовый блок для этого метода, возвращающий Rx Java Future - PullRequest
0 голосов
/ 21 января 2020

Может ли кто-нибудь помочь мне написать пример модульного теста для этого метода, возвращающего Rx Java Будущий объект, я могу написать и смоделировать для метода, возвращающего 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);
        }
    });
}

1 Ответ

0 голосов
/ 22 января 2020

Вы можете попробовать использовать MockWebServer от okhttp.

Таким образом, ваш 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());

    }
}

Этот тест, конечно, понадобится немного настройки для запуска в вашем проекте, но я надеюсь, что это даст представление о том, как подходить к тестированию фьючерсов Rx Java.

...