make it simple
article thumbnail

개요

  • 테스트마다 필요로하는 어노테이션을 매번 작성해주는 경우 만약 변경사항이 있을 경우 매번 수정해주는 부분이 유연성이 떨어진다. 그래서, 특별한 이유가 있지 않은 이상 테스트 환경은 공통으로 구성하고 사용하는게 유지보수 측면에서 좋다. 커스텀 어노테이션을 구성해도 괜찮지만 만약 공통으로 @Autowired나 @Mockbean처럼 의존성을 주입하는 경우가 있는 경우 추상 클래스로 만드는 경우가 더 낫다.

통합테스트

밑과 같이 3개의 어노테이션이 통합테스트에 공통으로 쓴다면

@ActiveProfiles("test")
@WithMockUser(username = "test", roles = "USER")
@SpringBootTest

1. IntegrationTestSupport.class  라는 추상 클래스를 생성한다.

@ActiveProfiles("test")
@WithMockUser(username = "test", roles = "USER")
@SpringBootTest
public abstract class IntegrationTestSupport {

    @MockBean
    protected MailSendClient mailSendClient;

}

2. 추상 클래스를 상속 받는다 또한 @Mockbean을 상속받은 클래스에서 사용할려면 protected로 접근 제한자로 설정해야한다.

class OrderServiceTest extends IntegrationTestSupport {
}

슬라이스 테스트(컨트롤러)

1. ControllerTestSupport 라는 컨트롤러 테스트를 위한 추상 클래스 생성

@WebMvcTest({OrderController.class, ProductController.class})
public abstract class ControllerTestSupport {
    @Autowired
    protected MockMvc mockMvc;

    @Autowired
    protected ObjectMapper objectMapper;

    @MockBean
    protected OrderService orderService;

    @MockBean
    protected ProductService productService;

}

2. @WebMvcTest에 사용할 컨트롤러 클래스 추가, 공통으로 사용하는 빈들을 추가해주면된다.

class OrderControllerTest extends ControllerTestSupport {
}

결론

  • 위와같이 매번 테스트 관련된 어노테이션을 테스트에 달아주기보단 위처럼 상속받고 환경설정에 관해서 수정사항이 있을경우, 부모 클래스만 수정하는게 훨씬 깔끔하고 유지보수 측면에서도 낫다. 항상 개발을 할 때 반복작업을 할 경우 무의식으로 반복작업을 하기보단 밑에 스텝으로 생각을 해야겠다.
    • 공통으로 사용해도 문제 없는지?
    • 문제 없는경우 장점과 단점이 무엇인지, 유지보수 측면에서는 어떨지
    • 어떻게 공통으로 사용할지? 

 

profile

make it simple

@keep it simple

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!