0. 시작하며
프로젝트에 Test 코드를 추가하며 Controller를 Junit으로 Test 하는 작업을 진행했습니다. 이 과정에서 @WebMvcTest와 MockMvc, BDDMockito를 학습하여 적용했습니다.
1. @WebMvcTest
스프링 부트에서 MVC관련 컴포넌트를 테스트하기위한 어노테이션으로 주로 Controller를 테스트할때 많이 사용됩니다. 테스트시에 필요한 레이어만 로드하여 테스트 속도가 빠릅니다. 동시에 전체 어플리케이션 동작을 테스트할때는 적합하지 않습니다.
2. MockMvc
실제 서버의 동작 없이 스프링 웹 MVC를 모의로 테스트할 수 있는 도구입니다. 자세한 설명은 공식문서를 활용하면 좋을거같습니다
3. BDDMockito
Mockito를 기반으로 BDD스타일의 테스트 작성을 지원하는 라이브러리입니다. Mockito의 기능은 그대로 사용할 수 있으면서 테스트 코드의 가독성과 표현력이 높아져 많이 사용되고 있습니다. 이 페이지를 참고하면 좋을거같습니다.
4. 적용 코드
@WebMvcTest(controllers = UserController.class)
class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper; // json으로 바꿔줌
@MockBean
private UserService userService;// service를 모킹
//...
}
이처럼 @WebMvcTest를 class 상단에 적용하여 controller를 테스트하도록 설정할 수 있습니다.
또한 MockMvc를 빈으로 등록하고, 해당 컨트롤러에서 사용될 service를 모킹하는 설정도 필요합니다.
@DisplayName("전체 유저 목록을 조회할 수 있다.")
@Test
void getUserList() throws Exception{
//given
LocalDate b = LocalDate.of(2024,05,23);
User u1 = User.create("u1","u1","email1","",b, Gender.M,"010","","", Category.N, Status.N);
User u2 = User.create("u2","u2","email2","",b, Gender.M,"010","","", Category.N, Status.N);
List<User> users = List.of(u1,u2);
given(userService.getUserList()).willReturn(users);
String expJson = objectMapper.writeValueAsString(users);
// when//then
mockMvc.perform(
get("/api-user/list")
)
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().json(expJson));
}
userList를 조회하는 api를 테스트하는 코드를 작성해봤습니다. given은 BDDMockito의 메서드로 Mockito라면 when을 사용하는 것과 같은 역할을 수행합니다. 이를 통해 userService의 리턴값을 모킹하고 해당 api를 테스트할 수 있게됩니다.
이러한 과정을 거쳐 Controller test를 진행할 수 있게됩니다.
5.레퍼런스
https://docs.spring.io/spring-framework/reference/testing/spring-mvc-test-framework.html
MockMvc :: Spring Framework
The Spring MVC Test framework, also known as MockMvc, provides support for testing Spring MVC applications. It performs full Spring MVC request handling but via mock request and response objects instead of a running server. MockMvc can be used on its own t
docs.spring.io
https://javadoc.io/doc/org.mockito/mockito-core/3.3.3/org/mockito/BDDMockito.html
BDDMockito - mockito-core 3.3.3 javadoc
Latest version of org.mockito:mockito-core https://javadoc.io/doc/org.mockito/mockito-core Current version 3.3.3 https://javadoc.io/doc/org.mockito/mockito-core/3.3.3 package-list path (used for javadoc generation -link option) https://javadoc.io/doc/org.m
javadoc.io
Practical Testing: 실용적인 테스트 가이드 | 박우빈 - 인프런
박우빈 | 이 강의를 통해 실무에서 개발하는 방식 그대로, 깔끔하고 명료한 테스트 코드를 작성할 수 있게 됩니다. 테스트 코드가 왜 필요한지, 좋은 테스트 코드란 무엇인지 궁금하신 모든 분을
www.inflearn.com