Внутренний список из DTO пуст во время тестирования с Spring WebFlux - PullRequest
0 голосов
/ 16 января 2020

У меня есть следующий модульный тест (JUnit 5):

FluxExchangeResult<CalendarDTO> calendarEntityResult = client.get()
                .exchange()
                .expectStatus().isOk()
                .expectHeader().contentType(MediaType.APPLICATION_JSON_UTF8)
                .returnResult(CalendarDTO.class);

        assertNotNull(calendarEntityResult);
        final Flux<CalendarDTO> responseBody = calendarEntityResult.getResponseBody();
        responseBody.flatMap(calendarDTO -> {
            assertNotNull(calendarDTO);
            final List<AppointmentDTO> calendarEvents = calendarDTO.getCalendarEvents();
            assertNotNull(calendarEvents);
            assertFalse(calendarEvents.isEmpty());

            return Flux.just(calendarEvents);
        }).map(calendarEvents ->
            calendarEvents.get(0)
        ).doOnNext(appointmentDTO ->
            assertEquals(appointmentDTO, validAppointmentDTO())
        ).subscribe();
        /*StepVerifier.create(responseBody)
            .assertNext(calendarDTO -> {
                assertNotNull(calendarDTO);
                final List<AppointmentDTO> calendarEvents = calendarDTO.getCalendarEvents();
                assertNotNull(calendarEvents);
                assertFalse(calendarEvents.isEmpty());

                final AppointmentDTO appointmentDTO = calendarEvents.get(0);
                assertNotNull(appointmentDTO);
                assertEquals(validAppointmentDTO(), appointmentDTO);
            })
        .expectComplete()
        .verify();*/

По какой-то причине assertNotNull(calendarEvents); не выполняется. Сам метод при запуске его с Почтальоном в порядке. Что меня озадачило, так это то, что во время отладки calendarEntityResult имеет calendarEvents!

> GET /appointments
> WebTestClient-Request-Id: [1]

No content

< 200 OK OK
< Content-Type: [application/json;charset=UTF-8]
< Content-Length: [377]

{"data":{"calendarEvents":[{"id":null,"startTime":"2020-01-16T13:19:37.510-06:00","endTime":"2020-01-16T14:19:37.511-06:00","timeZoneStart":"America/Regina","timeZoneEnd":"America/Regina","summary":"unit test summary","description":"unit test description","organizerName":"Developer","organizerEmail":"developer@dev.com","status":null,"alarm":15}]},"notifications":null}

Код с комментариями дает тот же результат. Чтобы было ясно, само DTO не является нулевым; проблема в массиве calendarEvents. Возможно, я делаю что-то не так, поскольку я новичок в реактивном программировании в целом, поэтому улучшения кода приветствуются. Я неправильно извлекаю данные?

Ответы [ 3 ]

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

Оказывается, root DTO уже был включен в еще одно DTO. Вероятно, это вызвало getResponseBody() неверное истолкование содержимого списка и по умолчанию равным нулю. Оставив здесь ответ для любопытных:

final Flux<AppointmentCalendarResponse> responseBody = client.get()
                .exchange()
                .expectStatus().isOk()
                .expectHeader().contentType(MediaType.APPLICATION_JSON_UTF8)
                .returnResult(AppointmentCalendarResponse.class)
                .getResponseBody();

        StepVerifier.create(responseBody)
                .assertNext(data -> {
                    CalendarDTO calendarDTO = data.getData();
                    final List<AppointmentDTO> calendarEvents = calendarDTO.getCalendarEvents();
                    assertNotNull(calendarEvents);
                })
        .expectComplete()
        .verify();
0 голосов
/ 17 января 2020

Вы используете одну и ту же БД?

Потому что обычно тест БД и БД Dev разные.

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

Вы должны использовать stepverifier при утверждении любого типа потока. Сделаю вашу жизнь проще.

    final Flux<String> responseBody = testClient.get()
            .exchange()
            .expectStatus()
            .isOk()
            .returnResult(String.class)
            .getResponseBody();

    StepVerifier.create(responseBody)
            .assertNext(s -> assertEquals(s, "Foo"))
            .assertNext(s -> assertEquals(s, "Bar"));
...