JUnit 5를 사용하여 컨트롤러에 메서드를 포인트컷으로 사용하는 Advice를 테스트 해보려고 합니다.
@SpringBootTest를 지정하면 모든 빈이 로드되어 Advice 테스트가 간단하지만 테스트가 무거워진다는 단점이 있습니다.
그래서 필요한 빈만을 주입하는 테스트를 작성했습니다.
@ActiveProfiles("dev")
@EnableConfigurationProperties
@SpringBootTest(
classes = {
CustomAspect.class,
CustomController.class
}
)
@EnableAspectJAutoProxy
class CustomControllerTest {
@Autowired
WebApplicationContext context;
MockMvc mockMvc;
@BeforeEach
void setUp(){
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
void 어드바이스를_테스트_한다() throws Exception {
mockMvc.perform(get("/end-point"))
.andExpect(status().isOk())
.andDo(print());
}
}
여기서 핵심은 @EnableAspectJAutoProxy 입니다. 이것을 적용하지 않으면 Aspect 클래스를 SpringBootTest의 클래스로 지정한다고 하더라도 Advice 로직이 수행되지 않습니다.
@EnabledAspectJAutoProxy에 대한 설명은 다음과 같습니다.
@EnableAspectJAutoProxy
는 Spring Framework에서 Aspect-Oriented Programming (AOP)을 활성화하기 위한 애노테이션입니다. 이 애노테이션을 사용하면 Spring의 AOP 기능을 설정하고, AspectJ의 프록시 기반 AOP 기능을 활성화할 수 있습니다.
@EnabledAspectJAutoProxy를 소스코드의 설정 클래스 뿐만 아니라 테스트 코드에서도 적용하여 프록시 기능을 테스트 해보시기 바랍니다.
부가적인 내용으로 어노테이션과 mockMvc를 왜 위와 같이 사용했는지 설명하겠습니다.
@ActiveProfiles, @EnableConfigurationProperties는 SpringBootTest를 수행하기 위해 환경설정을 잡아주고 있습니다.
@EnableConfigurationProperties를 사용하면 yml(yaml) 파일에 키-밸류를 읽어올 수 있습니다.
@SpringBootTest를 사용하여 클래스를 지정한 이유는 @ContextConfiguration을 사용하게 될 경우 프로퍼티의 키-밸류 쌍을 읽어들이지 못하는 문제가 있었기 때문입니다. 통합테스트가 필요할 경우 위와 같이 코딩하면 해결책이 될 수 있습니다.
JUnit5에서 @WebMvcTest를 사용하게 되면 mockMvc를 이용하여 REST API를 호출 시 별도의 스프링 설정이 적용되어 있지 않다면 401 Anthorized 에러를 뱉습니다. 그렇기 때문에 이 디폴트 값을 무시해야 할 필요가 있었고 레거시하지만 MockMvcBuilders를 통해 mockMvc를 생성한 것입니다.
'[개발] Test' 카테고리의 다른 글
A/B 테스트 (2) | 2024.10.07 |
---|---|
Spock Framework (0) | 2024.08.11 |
테스트 컨테이너 (0) | 2024.07.21 |
[TDD 연습] 계산기 만들기 (0) | 2024.06.30 |
하니스(Harness) (0) | 2024.06.29 |