1. 테스트
1-1) 의존성 체크
1-2) SsuController
1-3) SsuService
1-4) SpringBootTestCodeApplicationTest**(WebEnvironment.MOCK일 때)**
1-4)-1. @Runwith
@Runwith은 JUnit5부터는 사용하지 않음.
1-4)-2. webEnvironment 속성
MOCK(mock servlet environment) : 내장 톰캣을 사용하지 않음.
RANDOM_PORT / DEFINED_PORT :내장 톰캣을 사용함.
NONE : 서블릿 환경을 제공하지 않음.
1-4)-3. @AutoConfigureMockMvc
@Autowired를 사용해서 주입받는 방법이 가장 좋음.
1-4)-4. status().isOk()
status의 코드가 200, 정상인지 확인하는 거임.
1-4)-5. content().string(
출력되는 결과 값이 expectedContent, "hello ssu"와 동일한지 확인하는 거임.
1-4)-6. andDo()
요청에 대한 처리를 해주는 메소드임. print() 메소드가 들어옴.
Console
1-5) SpringBootTestCodeApplicationTest**(WebEnvironment.RANDOM.PORT일 때)**
1-5)-1. WebEnvironment.RANDOM_PORT
실제 Servlet Container인 내장 톰캣이 뜸. 이때부터는 MockMvc가 아니라
테스트용 REST template이나 테스트용 web Client를 사용해야 함.
1-5)-2. TestRestTemplate testRestTemplate
주입 받기
1-5)-3. getForObject("/hello", String.class)
url("/hello)을 주고 원하는 바디 타입을 준 다음(String.class),
이 값을 assertThat으로 확인함.
1-5)-4. 문제점
SsuService단까지 가기 때문에 테스트가 다소 길어질 수 있음.
SsuController까지만 테스트 하고 싶은 경우
1-6) SsuService단이 아닌 SsuController까지만 Test하고 싶을 때
1-6)-1. @MockBean
application context안에 들어있는 빈을 MockBean으로 교체함.
1-6)-2. SsuService mockService
SsuController까지만 돌기 위해서 SsuService를 받아왔음.
이렇게 하면 application context안에 있는 SsuService Bean이 mockbean으로 교체 됨.
따라서 SsuService는 mockService를 사용하게 됨.
1-6)-3. thenReturn()
기존 SsuService에서는 ssu를 리턴해줬지만 mockSsuService에서는 "ssuzy"를 리턴하도록 함.
따라서 출력되는 값은 "hello ssuzy"이 되므로 비교 값을 변경했음.
1-7) WebTestClient**(asynchronous, 비동기)**
1-7)-1. WebTestClient
WebClient는 SpringMVCWebflux쪽에 추가된 Rest Client 중 하나임. 우리가 기존에 사용하던
Rest Client는 synchronous(동기)임. 즉, 요청 하나를 보내면 그 요청이 끝날 때까지 기다린 다음
요청을 보낼 수 있음. 반면에 WebClient는 asynchronous(비동기)임. 요청을 보내고
기다리는 것이 아니라 응답이 오면 call back이 event로 오기 때문에
그때 call back을 실행할 수 있음.
테스트 코드에서 WebTestClient를 사용해서 WebClient와 비슷한 API를 사용할 수 있음.
WebClient를 사용하려면 Spring Web flux 디펜더시 추가
1-7)-2. WebTestClient Test Code
2. Slice Test
2-1) Slice Test
지금까지 해온 테스트는 모두 통합 테스트임. 자신이 원하는 빈만 등록하고 싶은 경우 사용하는 게
Slice Test임. 이 테스트는 레이어별로 잘라서 적용하기 때문에 @JsonTest, @WebMvcTest,
@WebFluxTest, @DataJpaTest 등 다양한 테스트 어노테이션이 있음.
2-2) @WebMvcTest
MVC를 위한 테스트 어노테이션으로 클래스를 특정해서 테스트할 수 있음.
또한 Web Layer만 빈으로 등록하기 때문에 가볍고 빠름.
Web Layer, @Controller, @JsonComponent, Converter, GenericConverter, Filter,
WebMvcConfigurer, HandlerMethodArgumentResolver임.
일반적으로 컴포넌트들은 빈으로 등록되지 않음.
⇒ 따라서 모든 의존성이 끊기기 때문에 사용하는 의존성이 있으면 @MockBean으로 채워져야 함.
3. 테스트 유틸