JUnit5 - 테스트 인스턴스

현시기얌·2021년 9월 4일
0

JUnit5

목록 보기
8/8

테스트 인스턴스

JUnit은 테스트 메소드마다 테스트 인스턴스를 새로 만든다.

  • 이것은 기본 전략
  • 테스트 메소드를 독립적으로 실행하여 예상치 못한 부작용을 방지하기 위함이다.
    이 전략을 JUnit5에서 변경할 수 있다.
public class TestInstanceTest {

    int value = 1;

    @FastTest
    @DisplayName("스터디 만들기 fast")
    void create_new_study() {
        System.out.println(this);
        System.out.println(value++);
        final Study study = new Study(StudyStatus.ENDED,1);
        assertThat(study.getLimit()).isGreaterThan(0);
    }

    @SlowTest
    @DisplayName("스터디 만들기 slow")
    void create_new_study_slow() {
        System.out.println(this);
        System.out.println("Slow " + value++);
    }
}

언뜻보면 위의 테스트코드에서 어디선가 value가 1 어디선가 2가 될거 같지만 실제 테스트를 실행해보면 value의 값은 1이다.
왜냐하면 JUnit은 테스트 메소드마다 테스트 인스턴스를 새로 만들기 때문이다.

위의 실행 결과를 보면 각각의 테스트 코드는 서로 다른 객체이기 때문에 해쉬코드의 값이 다르다는 것을 알 수 있다.

@TestInstance(Lifecycle.PER_CLASS)

  • 테스트 클래스당 인스턴스를 하나만 만들어 사용한다.
  • 경우에 따라, 테스트 간에 공유하는 모든 상태를 @BeforeEach 또는 @AfterEach에서 초기화 할 필요가 있다.
  • @BeforeAll과 @AfterAll을 인스턴스 메소드 또는 인터페이스에 정의한 default 메소드로 정의할 수도 있다.
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class TestInstanceTest {

    @BeforeAll
    void beforeAll() {
        
    }   
    
    @AfterAll
    void afterAll() {
        
    }     

위의 코드처럼 @TestInstance(TestInstance.Lifecycle.PER_CLASS) 애노테이션을 사용하면 클래스마다 인스턴스를 생성하기 때문에 이 테스트코드에 있는 메소드들은 하나의 인스턴스들을 공유하게 된다. 그러므로 @BeforeAll 과 @AfterAll에서도 static 메소드가 아니어도 정상적으로 실행되는 것을 볼 수 있다.

profile
현시깁니다

0개의 댓글