Spring @DirtiesContext

Spring DirtiesContext

스프링 단위 테스트 진행시 단독으로 수행되던 코드들이 통합테스트시에 Context를 공유하여 올바른 값이 도출되지 않는 경우가 있다. 그 이유는 하나의 Spring TEST Context에서 기존의 Context를 재사용함에 따라 발생하는 문제이다. 이러한 문제들을 해결하기 위하여 필요한것들이 @DirtiesContext 이다.

@DirtiesContext 어노테이션은 테스트를 수행전, 수행후, 각 테스트 케이스마다 수행하기 전, 수행한 이후에 Context를 재생성하는 역할을 한다.

@DirtiesContext

1
2
@DirtiesContext indicates that the underlying Spring ApplicationContext has been dirtied during the execution of a test (that is, the test modified or corrupted it in some manner — for example, by changing the state of a singleton bean) and should be closed. When an application context is marked as dirty, it is removed from the testing framework’s cache and closed. As a consequence, the underlying Spring container is rebuilt for any subsequent test that requires a context with the same configuration metadata.
You can use @DirtiesContext as both a class-level and a method-level annotation within the same class or class hierarchy. In such scenarios, the ApplicationContext is marked as dirty before or after any such annotated method as well as before or after the current test class, depending on the configured methodMode and classMode.

doc.spring.io에 따르면 @DirtiesContext ApplicationContext 테스트를 실행하는동안 테스트 프레임워크의 캐시를 제거하고 닫게합니다. 결과적으로 기본 Spring Container에 동일한 구성 메타 데이터가 있는 컨텍스트를 필요로하는 후속 테스트를 위해 재 빌드된다고 나와있습니다.

또한, 클래스 계층 구조내에서 클래스 수준 주석과 메서드 수준 수적으로 모두 사용할 수 있습니다.

클래스 테스트 시작전 Context 재생성

1
2
3
4
@DirtiesContext(classMode = BEFORE_CLASS) 
class FreshContextTests {
// some tests that require a new Spring container
}

클래스 테스트 이후 Context 재생성

1
2
3
4
@DirtiesContext 
class ContextDirtyingTests {
// some tests that result in the Spring container being dirtied
}

모든 테스트 케이스마다 시작하기 이전 Context 재생성

1
2
3
4
@DirtiesContext(classMode = BEFORE_EACH_TEST_METHOD) 
class FreshContextTests {
// some tests that require a new Spring container
}

모든 테스트케이스가 끝날때 마다 Context 재생성

1
2
3
4
@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD) 
class ContextDirtyingTests {
// some tests that result in the Spring container being dirtied
}

특정 케이스 시작전 Context 재생성

1
2
3
4
5
@DirtiesContext(methodMode = BEFORE_METHOD) 
@Test
void testProcessWhichRequiresFreshAppCtx() {
// some logic that requires a new Spring container
}

특정 케이스 시작 이후 Context 재생성

1
2
3
4
5
@DirtiesContext 
@Test
void testProcessWhichDirtiesAppCtx() {
// some logic that results in the Spring container being dirtied
}

Reference

https://shortstories.gitbooks.io/studybook/content/dirtiescontext.html

https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#spring-testing-annotation-dirtiescontext