Spring Test 시 Context를 효율적으로 구성하는 법

eora21·2023년 12월 16일
0

테스트 코드의 구성에 따라 Context가 새로이 만들어질 수 있습니다. Context 캐싱 등을 잘 활용하기 위해서는 효율적으로 Context를 구성하는 법을 알아야 합니다.

Context 분리

@DirtiesContext를 사용하면 해당 테스트 자체를 기존의 Context와 분리하여 만들 수 있습니다. 꼭 필요한 Context만 분리하여 무의미한 Context 생성을 막을 수 있습니다.
그러나 Context 구성이 커지면 커질수록 Context를 생성하는 시간이 오래 걸릴 수 있습니다.

Tip: 계층마다 Mock을 모아둔 Abstract Class 선언

@DirtiesContext는 매 테스트마다 새로운 Context를 만듭니다. 최소한의 Context 구성으로 동작시키기 위해서는 각 테스트 계층(@SpringBootTest, @WebMvcTest, @DataJpaTest 등을 사용하는 테스트들)에 필요한 Mock을 Abstract Class에 선언해둔 후 extends를 통해 필요한 테스트 코드를 작성하여 Context의 생성을 최소화할 수 있습니다.

@SQL 사용

@Sql 사용으로 테스트마다 DB 상태를 재구성할 수 있습니다. Context를 동일하게 유지하면서도 각 테스트에서 원하는 데이터를 미리 준비 가능합니다.

리플렉션을 통해 Proxy Bean으로 갈아끼우기

@MockBean, @SpyBean을 사용하면 Context가 재설정될 수 있습니다. 해당 어노테이션들로 인해 기존 Context의 원본 Bean 대신 테스트 더블을 위한 Proxy Bean으로 대체되기 때문입니다. 이후의 테스트들에서는 기존의 Context가 오염되었다고 판단하여 다시금 Context를 만들게 됩니다.

리플렉션을 활용하여 테스트 동작 전 프록시 빈을 설정하고, 테스트가 끝난 후 원래의 빈으로 변경하면 Context 오염을 막을 수 있습니다. 다만 해당 작업을 직접 작업하기보단 @MockInBean이나 @MockWrapperBean 등의 라이브러리 사용 및 참고를 추천합니다.

Unit Test로 만들기

테스트의 범위를 좁혀 Context와 무관한 로직 중심의 테스트로 만드는 방법입니다.
@MockBean, @SpyBean 대신 Mock, Spy를 사용하도록 변경하여 불필요한 Context의 생성을 막을 수 있습니다.
@InjectMocks를 이용하거나 생성 시 파라미터로 Mock, Spy 객체를 넣어 구성할 수 있습니다.

참고

https://hyewoncc.github.io/test-annotations/
https://tecoble.techcourse.co.kr/post/2022-10-15-test-code-optimization/

profile
나누며 타오르는 프로그래머, 타프입니다.

0개의 댓글