-
스프링부트 Web-Flux 03 - 2 - WebFlux 조금 더 깊게 보기(Juit Test)카테고리 없음 2021. 10. 26. 10:21
유투버 '데어 프로그래밍'님 강의 참조
01 Junit 컨트롤러 테스트
1) 통합 테스트 코드
@SpringBootTest @AutoConfigureWebTestClient public class CustomerControllerTest { @Autowired private WebTestClient webClient; @Test public void findOneTest() { } }
2) 필수 컨트롤러 테스트
@WebFluxTest public class CustomerControllerTest { @MockBean private CustomerRepository customerRepository; @Autowired private WebTestClient webClient; @Test public void findOneTest() { Mono<Customer> givenData = Mono.just(new Customer("Jack", "Bauer")); when(customerRepository.findById(1L)).thenReturn(givenData); webClient.get().uri("/customer/{id}", 1L) .exchange() .expectBody() .jsonPath("$.firstName").isEqualTo("Jack") .jsonPath("$.lastName").isEqualTo("Bauer"); } }
- @MockBean으로 가짜 레퍼지토리를 띄어서 실제 DB에 있는 데이터를 들고 올 수 있도록 하고
- @Autowired로 WebTestClient가 가능하도록 메모리에 띄우고
- 현재 원하는 테스트는 실제 만들어 놓은 컨트롤러의 'findById' 이므로 이 컨트롤러가 테스트 되도록 함수 세팅
- 하나만 불러오는 테스트이니 Mono<>를 써서 데이터를 강제 세팅
- when()(STUB이라고 부름)을 써서 when("") 안이 실행되면 thenReturn() 값을 돌려 주게 됨
- webClient를 이용하여 'findById' 컨트롤러 테스트가 되도록 똑같은 uri를 세팅
- json 형태로 강제로 넣은 데이터를 받아 옴
여기서는 데이터 테스트가아닌 컨트롤러가 잘 불러지는지 테스트임 02 Junit 레파지토리 테스트
@DataR2dbcTest @Import(DBinit.class) public class CustomerRepositoryTest { @Autowired private CustomerRepository customerRepository; @Test public void findOneTest() { customerRepository.findById(1L).subscribe((c)->{ System.out.println(c); }); } }
- 레파지토리 및 DB 테스트이므로 @DataR2dbcTest가 필요
- DB에 접근하려면 DBinit 클래스가 필요하므로 @Import 해줌
- DB테스트 이므로 그대로 원하는 레퍼지토리를 @Autowired 해줌
- 그리고 원하는 테스트 함수를 만들어 레파지토리에서 꺼내오는 테스트
굿! - 여기에 추가로 데이터 유효성 검사 진행을 해주는게 좋다.
@DataR2dbcTest @Import(DBinit.class) public class CustomerRepositoryTest { @Autowired private CustomerRepository customerRepository; @Test public void findOneTest() { StepVerifier .create(customerRepository.findById(2L)) .expectNextMatches((c) -> { return c.getFirstName().equals("Chloe"); }) .expectComplete() .verify(); } }
- 디비에 있는값과 맞는지 StepVerifier를 이용하여 맞춰 보는 것. Boolean으로 리턴되기때문에 값이 맞으면 True 아니면 False를 리턴함
굿!