반응형
1. Controller Test(Web Layer)
1.1 컨텍스트 로드테스트
- 컨텍스트가 정상적으로 올라오는지 확인하기 위해 추가
@SpringBootTest
class TestingWebApplicationTest {
@Autowired
private HomeController controller;
@Test
public void contextLoads() {
assertThat(controller).isNotNull();
}
}
1.2. Controller Test
1.2.1. HttpRequest Test
- 프로덕션과 마찬가지로 http 요청을 통해 응답을 확인할 수 있음
- 실제 서버를 구동시키는 것과 유사하게 테스트 동작
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class HttpRequestTest {
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
@Test
public void greetingShouldReturnDefaultMessage() throws Exception {
assertThat(this.restTemplate.getForObject("http://localhost:" + port + "/",
String.class)).contains("Hello, World");
}
}
1.2.2. Testing WebApplication Test
- 콘텍스트만 올려서 시작하는 방법
- MockMvc를 활용
@SpringBootTest
@AutoConfigureMockMvc
class TestingWebApplicationTest {
@Autowired
private MockMvc mockMvc;
@Test
public void shouldReturnDefaultMessage() throws Exception {
this.mockMvc.perform(get("/"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string(containsString("Hello, World")));
}
}
1.2.3. WebLayer Test
- 위 예제에서는 @SpringBootTest 어노테이션을 사용해서 컨텍스트에 스프링에서 사용하는 bean들을 모두 올리고 시작함
- @WebMvcTest 어노테이션을 사용해서 WebLayer에 필요한 bean 들만 올려서 사용 가능
@WebMvcTest
public class WebLayerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void shouldReturnDefaultMessage() throws Exception {
this.mockMvc.perform(get("/"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string(containsString("Hello, World")));
}
}
- 컨트롤러가 여러개인 경우 하나만 인스턴스화 해서 사용하도록 요청할 수도 있음 @WebMvcTest(HomeController.class)
1.2. 의존성이 있는 Controller Test
@Controller
public class GreetingController {
private final GreetingService service;
public GreetingController(GreetingService service){
this.service = service;
}
@RequestMapping("/greeting")
public @ResponseBody String greeting() {
return service.greet();
}
}
...
@Service
public class GreetingService {
public String greet() {
return "Hello, World";
}
}
- 의존성을 컨트롤러에 주입해준다.
@WebMvcTest(GreetingController.class)
public class WebMockTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private GreetingService service;
@Test
public void greetingShouldReturnMessageFromService() throws Exception {
when(service.greet()).thenReturn("Hello, Mock");
this.mockMvc.perform(get("/greeting"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string(containsString("Hello, Mock")));
}
}
반응형
'IT > TDD & Test' 카테고리의 다른 글
[JUnit] 파일 & 리소스 (/src/test/resources) 가져오기 (0) | 2022.08.01 |
---|---|
[JUnit] Dynamic Tests (0) | 2022.07.30 |
[JUnit] 객체 타입 체크 (0) | 2022.07.26 |
[JUnit] JUnit에서 현재 실행 중인 테스트 이름 가지고 오기 (0) | 2022.07.25 |
RestClientTest를 알아보자~ (0) | 2021.03.27 |