본 내용은 백기선님의 스프링 부트 개념과 활용 영상을 보고 정리한 내용입니다.
spring-boot-starter-test 의존성 추가
webEnvironment 옵션
- Mock : mock servlet environment. 내장 톰캣 구동 x
- RANDOM_PORT, DEFINED_PORT : 내장 톰캣 사용
- NONE : 서블릿 환경 제공 X
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc //MockMvc 를 주입받는 다양한 방법 중 하나
public class SampleControllerTest {
@Autowired
MockMvc mockMvc;
@Test
public void 헬로() throws Exception{
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("seokhun hello"))
.andDo(print());
}
}
RestTemplate 테스트 하는 방법
- TestRestTemplate
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Autowired
TestRestTemplate testRestTemplate;
@Test
public void restTemplateTest(){
String result = testRestTemplate.getForObject("/hello",String.class);
assertThat(result).isEqualTo("seokhun hello");
}
RestTemplate을 테스트 할 수 있는 TestRestTemplate
을 주입받는다.
또한 WebEnvironment 옵션을 Random_port로 설정해주면 된다.
하지만 위의 2가지 테스트는 테스트 범위가 너무 크다.
Controller를 테스트 하기 위해 Service까지 가져다 사용하고 있다.
이를 분리해보자.
@MockBean
- ApplicationContext에 들어있는 빈을 Mock으로 만든 객체로 교체
- 모든 @Test 마다 자동으로 리셋.
//이렇게 하면 여기서 만든 MockBean으로 서비스를 교체해준다.
@MockBean
SampleService mockSampleService;
@Test
public void mockingController(){
when(mockSampleService.getHello()).thenReturn("Inflearn");
String result = testRestTemplate.getForObject("/hello",String.class);
assertThat(result).isEqualTo("seokhun Inflearn");
}
@WebTestClient
- Async하게 동작하기 때문에, WebClient와 비슷한 api 콜백을 받을 수 있다.
의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
//Async 하게 동작
@Autowired
WebTestClient webTestClient;
//웹 클라이언트 사용
@Test
public void webTestClient(){
when(mockSampleService.getHello()).thenReturn("InflearnClient");
webTestClient.get().uri("/hello").exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("seokhun InflearnClient");
}
그 밖에 SpringBootTest를 사용하지 않고 각각의 레이어 별로 테스트하고 싶다면
- @JsonTest
- @WebMvcTest
- @WebFluxTest
- @DataJpaTest
등등이 있다.
테스트 유틸
- OutputCapture
output으로 출력되는 모든것들이 캡쳐가 된다.
특이하게 public 으로 명시해줘야한다.
//OutputCapture
@Rule
public OutputCapture outputCapture = new OutputCapture();
@Test
public void outPutCapture() throws Exception {
when(mockSampleService.getHello()).thenReturn("Inflearn");
mockMvc.perform(get("/hello"))
.andExpect(content().string("seokhun Inflearn"));
assertThat(outputCapture.toString())
.contains("output")
.contains("capture");
}
'Spring Boot' 카테고리의 다른 글
[Spring Boot] SOP와 CORS (0) | 2019.12.27 |
---|---|
[Spring Boot] 로깅 퍼사드 VS 로거 (0) | 2019.12.27 |
[Spring Boot] SpringApplication.class (0) | 2019.12.25 |
[Spring Boot] @SpringBootApplication (0) | 2019.12.25 |
Springboot JPA CRUD 완전정복 (with @Test) (0) | 2019.11.14 |
댓글