복붙노트

[SPRING] Spring Webflux,`ServerResponse` 테스트

SPRING

Spring Webflux,`ServerResponse` 테스트

ServerRequest를 수신하고 Mono 를 리턴하는 핸들러 메소드를 테스트하려면 어떻게해야합니까?

org.springframework.mock.web.reactive.function.server.MockServerRequest.builder ()를 통해 ServerRequest를 만들 수 있습니다. 그리고 ServerResponse.statusCode ()를 주장하십시오. 그러나이 ServerResponse의 본문을 테스트하고 싶지만 추출 할 방법이 없습니다.

ServerResponse response = target.search(MockServerRequest.builder()
    .method(HttpMethod.GET)
    .build()
  ).block();

assertThat(response.statusCode()).isEqualTo(HttpStatus.OK);
//assertThat(response.body()).isNotNull();

WebTestClient로 더 넓은 테스트를 원하지 않고 단위 테스트로 가능한 모든 응답 사례를 테스트하고 싶습니다.

감사

해결법

  1. ==============================

    1.따라서 가장 좋은 해결책은 WebTestClient를 사용하는 것 같습니다. 그러나이 서버는 실행중인 서버없이 사용할 수 있습니다.

    따라서 가장 좋은 해결책은 WebTestClient를 사용하는 것 같습니다. 그러나이 서버는 실행중인 서버없이 사용할 수 있습니다.

    트릭은 bindTo .. () 빌더 메소드를 사용하는 것입니다. 제 경우에는 bindToRouterFunction (new MyRouter (new MyHandler ()))이 잘 작동합니다

  2. ==============================

    2.모든 테스트에 대해 전체 Spring 컨텍스트를 시작하고 싶지 않기 때문에 정확히 같은 질문이있었습니다. 자체 답변 정보를 보내 주셔서 감사합니다. Mockito와 JUnit5를 포함한 완전한 예제는 다음과 같습니다.

    모든 테스트에 대해 전체 Spring 컨텍스트를 시작하고 싶지 않기 때문에 정확히 같은 질문이있었습니다. 자체 답변 정보를 보내 주셔서 감사합니다. Mockito와 JUnit5를 포함한 완전한 예제는 다음과 같습니다.

    import java.util.Arrays;
    import org.junit.jupiter.api.BeforeEach;
    import org.junit.jupiter.api.Test;
    import org.junit.jupiter.api.extension.ExtendWith;
    import org.mockito.Mock;
    import org.mockito.Mockito;
    import org.mockito.junit.jupiter.MockitoExtension;
    import org.springframework.http.MediaType;
    import org.springframework.test.web.reactive.server.WebTestClient;
    
    @ExtendWith(MockitoExtension.class)
    class UsersHandlerTest {
      @Mock
      UserRepository userRepository;
    
      WebTestClient client;
    
      @BeforeEach
      public void setUp() {
        UsersHandler usersHandler = new UsersHandler(userRepository);
        Router router = new Router(usersHandler);
    
        Mockito.when(userRepository.findAll()).thenReturn(
          Arrays.asList("", ""));
    
        client = WebTestClient.bindToRouterFunction(router.getUsers()).build();
      }
    
      @Test
      public void getCommands() {
        client.get().uri("/users")
          .accept(MediaType.APPLICATION_JSON_UTF8)
          .exchange()
          .expectStatus().isOk()
          .expectBody().json("{}");
      }
    }
    
  3. from https://stackoverflow.com/questions/51893453/spring-webflux-testing-serverresponse by cc-by-sa and MIT license