본문 바로가기
[개발] Test

@EnableAspectJAutoProxy를 사용하여 AOP 테스트하기

by Devsong26 2024. 8. 6.

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