[F-Lab] 모각코 챌린지 8일차

tree·2023년 5월 9일
0

@DirtiesContext

  • Junit은 테스트 도중에 하나의 테스트 메소드로 인한 테스트 인스턴스의 상태 변화가 다른 테스트 메소드에 영향을 끼치는 것을 막기 위해 각 메소드 실행 전에 테스트 인스턴스를 새로 생성하여 테스트 메소드를 호출한다.
  • 하지만 테스트 인스턴스와는 별개로 테스트에 사용되는 ApplicationContext는 테스트 메소드마다 로드되지 않는다. TestContext Framework는 한번 context를 로드했으면 이걸 캐시해두었다가 같은 test suite 내의 테스트 케이스 중에서 동일한 context를 사용하는 테스트 케이스가 있으면 캐시된 context를 재사용한다.
    • ApplicationContext는 로드할 때 사용되는 설정 변수들에 의해 식별될 수 있다. 이 설정 변수들의 조합을 사용해 키를 생성하고 키와 ApplicationContext 쌍으로 캐시해둔다.
  • 변화된 어플리케이션 컨텍스트에 의해서 테스트 간의 격리가 깨지는 경우가 발생할 때, @DirtiesContext 어노테이션을 사용하면 된다.

스프링 테스트에서 애플리케이션 컨텍스트는 딱 한 개만 만들어지고 모든 테스트에서 공유해서 사용한다. 따라서 애플리케이션 컨텍스트의 구성이나 상태를 테스트 내에서 변경하지 않는 것이 원칙이다. 만약 변경하면 나머지 모든 테스트를 수행하는 동안 변경된 애플리케이션 컨텍스트가 계속 사용될 것이다. 이는 바람직하지 못하다.
이럴때 @DirtiesContext라는 어노테이션을 추가해주면 된다. 이 애노테이션은 스프링의 테스트 컨텍스트 프레임워크에게 해당 클래스의 테스트에서 애플리케이션 컨텍스트의 상태를 변경한다는 것을 알려준다. 테스트 컨텍스트는 이 애노테이션이 붙은 테스트 클래스에는 애플리케이션 컨텍스트 공유를 허용하지 않는다. 테스트 중에 변경한 컨텍스트가 뒤의 테스트에 영향을 주지 않게 하기 위해서다.
-토비의 스프링中

사용법

  • 테스트 스위트 끝난 후 context 재생성

    @DirtiesContext
    public class TestClass {
    }
  • 테스트 스위트 시작 전 context 재생성

    @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
    public class TestClass {
    }
  • 모든 테스트 케이스 끝난 후 context 재생성

    @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
    public class TestClass {
    }
  • 모든 테스트 케이스 시작 전 context 재생성

    @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
    public class TestClass {
    }
  • 특정 테스트 케이스 끝난 후 context 재생성

    @DirtiesContext(methodMode = DirtiesContext.MethodMode.AFTER_METHOD)
    void test() {
    }
  • 특정 테스트 케이스 시작 전 context 재생성

    @DirtiesContext(methodMode = DirtiesContext.MethodMode.BEFORE_METHOD)
    void test() {
    }

0개의 댓글