Насмешка над ответом http с использованием vert.x rxjava2 и Mockito - PullRequest
1 голос
/ 29 января 2020

Я играю с веб-клиентом rx java vert.x (версия 3.8.4). Мой клиент будет вызывать некоторые службы, поэтому, по словам 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
...

Что мне здесь не хватает?

1 Ответ

2 голосов
/ 29 января 2020

Мой совет - использовать MockWebServer от okhttp для такого рода тестовых примеров.

MockWebserver может быть создан для каждого теста и позволит вам создать URL-адрес веб-службы, который будет использоваться вашей тестируемой реализацией для отправьте реальный http-запрос против него.

Перед этим вы можете определить ложный ответ, который будет возвращен mockwebserver вашей реализации.

Я не знаю ваш тестовый пример, но это Фрагмент должен прояснить, как работает MockWebServer.

Дополнительные примеры и полный документ можно найти на их репозитории github .

Как вы можете видеть ниже, вы можете сделать пару утверждений, например. если был использован правильный метод запроса, сколько запросов было сгенерировано и были ли использованы правильные параметры и тело запроса во время запроса.

    @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());

        }
    }
...