반응형
service layer의 테스트 코드에 이어서 controller layer의 테스트 코드 작성하는 방법을 정리해두자. controller를 테스트하기 위해서 주로 @WebMvcTest 애너테이션(이름대로 WebMvc와 관련된 Bean이 등록된다)을 적용한 테스트 클래스에서 테스트 한다.
MockMvc: 요청과 응답을 모방하는 클래스다. DispatcherServlet에 요청을 보내는 식으로 작동한다.
배운 것과 나의 생각
- Spring security를 사용할 때, 유저 인증 정보를 단위 테스트에서 받을 수 없다. @WebMvcTest는 Spring security configuration을 등록하지 않기 때문에 내가 SecurityConfig에 등록한 필터가 적용되지 않는다. 그래서 SecurityContextHolder에 인증 객체를 직접 넣어줘야 한다.
- 컨트롤러 단위 테스트 코드를 작성하다 보니 응답 코드를 제외하면 다른 단위 테스트에서 이미 검증된 내용들이였다. 중복 테스트를 지양하기 때문에 의미 없는 테스트를 하지 않고, 통합 테스트를 진행했다.
테스트 코드
@WebMvcTest(controllers = CardController.class)
class CardControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private CardService cardService;
@BeforeEach
void setUp() {
UserDetailsImpl testUserDetails = new UserDetailsImpl(Member.builder()
.username("user")
.password("password")
.build());
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(
testUserDetails, testUserDetails.getPassword(), testUserDetails.getAuthorities()));
}
@Test
public void createCardTest() throws Exception {
//given
given(cardService.create(any(CardCreateRequest.class), anyString()))
.willReturn(new CardDetailResponse("title", "content",
"author", LocalDate.of(2022, 10, 10)));
//when + then 응답 검증은 Dto 단위 테스트에서 이미 했으니 넘어간다
mockMvc.perform(MockMvcRequestBuilders
.post("/cards").with(csrf())
.contentType(MediaType.APPLICATION_JSON)
.content("{\"title\":\"title\",\"content\":\"content\"}"))
.andExpect(status().isCreated());
}
}
반응형
'Tool > Spring' 카테고리의 다른 글
[Spring] 커스텀 어노테이션으로 DTO 유효성 검사하기 (0) | 2023.12.14 |
---|---|
[Spring boot] 외부 파일 저장소를 사용할 때 트랜잭션은 어떻게 관리해야 할까? (with. AWS S3) (2) | 2023.12.11 |
[Spring boot] Service layer 테스트 코드 작성하기 (0) | 2023.12.04 |
[Spring boot] Dto 유효성 검사 테스트 코드 작성하기 (0) | 2023.12.03 |
[Spring boot] H2 데이터베이스에서 MySQL dialect 설정하기 (0) | 2023.12.01 |