의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
테스트 클래스 설명
- @SpringBootTest
- @RunWith(SpringRunner.class)와 함께 사용
- 빈 설정 파일을 알아서 찾아서 사용
(SPringBootApplication을 찾아가 모든 빈을 스캔 -> Test용 application Context를 만들면서 모든 빈들을 등록 - webEnvironment
- MOCK:
- 서블릿 컨테이너를 띄우지 않음(내장 톰캣 구동 X)
- 서블릿을 MockUp 하여 사용
- MockMvc 사용(@AutoConfigureMockMvc 추가) -> MockUp 된 서블릿과 interaction - RANDOM_PORT, DEFINED_PORT
- 실제로 서블릿을 띄움(내장 톰캣 구동)
- TestRestTemplate or TestWebClient를 사용해야 함
- @MockBean을 사용하여 테스트 범위를 줄일 수 있음 - NONE:
- 서브릿 환경 제공 안 함
- MOCK:
- 슬라이스 테스트
- @SpringBootTest는 모든 빈을 스캔하여 진행하는 통합 테스트 -> 무겁다. -> 테스트할 빈들만 등록 필요
- 종류
- @JsonTest
- Json 형태 테스트 - @WebMvcTest
- ex)
Controller 빈 하나만 테스트 -> 웹 객체 밑에 있는 의존성이 끊김 -> MockBean으로 의존성 추가 필요 - ...
- @JsonTest
테스트 코드
Mock 환경 테스트
// WebEnvironment가 mock 환경일 때 테스트 하는 방법
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
@AutoConfigureMockMvc
@RunWith(SpringRunner.class)
class SpringtestdemoApplicationTests {
@Autowired
MockMvc mockMvc;
@Test
public void hello() throws Exception {
mockMvc.perform(get("/hello"))
.andExpect(status().isOk())
.andExpect(content().string("hello bigring"))
.andDo(print());
}
}
@RestController
public class SampleController {
@Autowired
private SampleService sampleService;
@GetMapping("/hello")
public String hello(){
return "hello "+ sampleService.getName();
}
}
@Service
public class SampleService {
public String getName() {
return "bigring";
}
}
실제 서블릿 컨테이너 환경(TestRestTemplate 사용)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
class SpringtestdemoApplicationTests {
@Autowired
TestRestTemplate testRestTemplate;
//서비스 단계까지 테스트 하고 싶지 않을 때, 컨트롤러만 테스트 하고 싶을 때
@MockBean
SampleService mockSampleService;
@Test
public void hello() throws Exception {
//MockBean으로 Service를 만들었으므로 Mocking할 수 있음
when(mockSampleService.getName()).thenReturn("bigring");
String result = testRestTemplate.getForObject("/hello",String.class);
assertThat(result).isEqualTo("hello bigring");
}
}
실제 서블릿 컨테이너 환경(WebTestClient사용)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@WebMvcTest(SampleController.class)
@RunWith(SpringRunner.class)
class SpringtestdemoApplicationTests {
@Autowired
WebTestClient webTestClient;
@Autowired
MockMvc mockMvc;
@Test
public void hello() throws Exception {
when(mockSampleService.getName()).thenReturn("bigring");
webTestClient.get().uri("/hello").exchange()
.expectStatus().isOk()
.expectBody(String.class).isEqualTo("hello bigring");
}
}
WebTestClient은 비동기, 기존에 RestClient는 동기적
- 요청을 보내고 응답이 오면 콜백이 옴
- 그때 콜백을 실행
- 웹 클라이언트와 비슷한 API로 테스트 가능
슬라이스 테스트(@WebMvcTest 사용)
@WebMvcTest(SampleController.class)
@RunWith(SpringRunner.class)
class SpringtestdemoApplicationTests {
@MockBean
SampleService mockSampleService;
@Autowired
MockMvc mockMvc;
@Test
public void hello() throws Exception {
when(mockSampleService.getName()).thenReturn("bigring");
mockMvc.perform(get("/hello"))
.andExpect(content().string("hello bigring"));
}
}
Reference
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8
'Spring > 이론' 카테고리의 다른 글
HtmlUnit (0) | 2020.06.03 |
---|---|
JPQL (0) | 2020.05.17 |
SpringBoot (0) | 2020.04.22 |
Restful Web Service with Spring (0) | 2020.04.20 |
Restful Web Service (0) | 2020.04.19 |
댓글