Spring Webflux (reactor) testowanie

0

Mam metodę, która tworzy taska dla użytkownika i zwraca Mono z dtosa utworzonego taska:

public Mono<TaskDTO> createTask(CreateTaskDTO dto) {
    return reactiveTaskRepository
            .add(new Task(dto.content(), dto.priority(), dto.status(), dto.username() ) )
            .map(Task::toDTO);
  }

Chciałbym otestować to tak, że po wywołaniu metody createTask używam metody readTaskById i sprawdzam czy dtosy się zgadzają. Test wygląda tak:

 @Test
 @WithMockUser(username = "user1")
    void should_add_task() {
        var sampleUser = addSampleUser().block();
        taskFacade.createTask(
                new CreateTaskDTO(
                        "Content",
                        TaskPriority.LOW,
                        TaskStatus.UNDONE,
                        sampleUser.username()
                )
        ).subscribe(createdTaskDTO -> StepVerifier
                .create(taskFacade.readTaskById(createdTaskDTO.id() ) )
                .expectNext(createdTaskDTO)
                .verifyComplete()
        );
    }

Problem w tym, że nawet jeśli test nie przejdzie przez ten framework do testowania Reactora (np. poda się randomowe id taska i poleci exception) to sam test spring-bootowy zawsze przechodzi. Dostaje taki błąd (oczekiwany z resztą):

reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.AssertionError: expectation "expectNext(TaskDTO[id=2cd98d15-943a-4e50-99ac-12bb5242830c, content=Content, priority=LOW, status=UNDONE, creationDate=2022-08-13T0902.817465400Z])" failed (expected: onNext(TaskDTO[id=2cd98d15-943a-4e50-99ac-12bb5242830c, content=Content, priority=LOW, status=UNDONE, creationDate=2022-08-13T0902.817465400Z]); actual: onError(com.example.taskmanager.task.domain.exception.TaskNotFoundException: Task not found: bc8e4c9c-bbea-4c20-95af-39fd75366645))
Caused by: java.lang.AssertionError: expectation "expectNext(TaskDTO[id=2cd98d15-943a-4e50-99ac-12bb5242830c, content=Content, priority=LOW, status=UNDONE, creationDate=2022-08-13T0902.817465400Z])" failed (expected: onNext(TaskDTO[id=2cd98d15-943a-4e50-99ac-12bb5242830c, content=Content, priority=LOW, status=UNDONE, creationDate=2022-08-13T0902.817465400Z]); actual: onError(com.example.taskmanager.task.domain.exception.TaskNotFoundException: Task not found: bc8e4c9c-bbea-4c20-95af-39fd75366645))

A test jest na zielono.

1

Uruchamiasz nieblokujący kod, więc test się kończy zanim ten StepVerifier może w ogóle zadziałać.
Zamiast robić subscribe musisz użyć StepVerifier.create. Ogólnie robienie manualnie subscribe zazwyczaj jest kiepskim pomysłem.

0

Pocisnę herezją ale czemu w teście, na mono nie wykonasz metody .block() i sobie nie wrzucisz tego DTO w asercje?

1 użytkowników online, w tym zalogowanych: 0, gości: 1