Languege/Java & Spring / / 2023. 5. 17. 15:24

Junit5 상속관계에서 BeforeEach 순서

최근 TDD와 테스트 코드에 사랑에 빠져 사내 프로젝트에 테스트 커버리지를 높이고 있는데
Api 테스트를 할때 보통 로그인이 전제가 되어야 하는데, 도메인 별 테스트를 만들때마다 계속 반복되는
로그인을 하는 로직을 넣는 바보같은 행동을 하고 싶지 않아서 ApiTest를 만들어두고 이곳에 로그인 로직을 두고
Domain 별 테스트에서는 API만 테스트하려 하는데 이때 beforeEach의 순서를 정해야 하는 일이 발생했습니다.

 

Junit5 상속관계에서 BeforeEach 순서는 어떻게 될까?

아래 코드에서 보면 ApiTest의 setUp이 먼저 실행되는걸 확인할 수 있습니다.

public class DomainTest extends ApiTest {
    @BeforeEach
    void setUp1() {
        System.out.println("DomainTest .setUp1");
    }
    
    @Test
    void 테스트1() {
    	~~~
    }
}

public class ApiTest{
    @BeforeEach
    void setUp2() {
        System.out.println("ApiTest.setUp2");
    }
}

여기서 DomainTest의 테스트1을 실행하면 ApiTest클래스의 setUp()이 먼저 실행됩니다.

DomainTest의 setUp1() 메서드가 ApiTest의 setUp2() 메서드보다 나중에 실행되는 이유는 DomainTest가 ApiTest를 확장하기 때문입니다. 자식 클래스의 @BeforeEach 메서드는 부모 클래스의 @BeforeEach 메서드 후에 실행됩니다.

 

그렇다면 어떤 방법으로 ApiTest가 먼저 출력되도록 할 수 있을까요?

public class DomainTest extends ApiTest {
    @BeforeEach
    @Order(1)
    void setUp() {
        System.out.println("DomainTest .setUp1");
    }
    
    @Test
    void 테스트1() {
    	~~~
    }
}

public class ApiTest{
    @BeforeEach
    @Order(2)
    void setUp() {
        System.out.println("ApiTest.setUp2");
    }
}

위의 방법을 통해서 시도했을 때, 당연히 DomainTest가 먼저 실행될거라 생각하겠지만 테스트해보면 setUp2가 실행 된 후에, setUp1이 실행됩니다.

 

다양한 테스트와 구글링 결과, 상속 관계에서는 @Order 어노테이션으로 이 문제를 푸는 방법은 찾지 못했습니다.(방법이 있다면 댓글 부탁드리겠습니다!)

해결방법

만약 DomainTest의 setUp을 먼저 실행하고 싶다면 상속 대신 컴포지션을 사용하여 관련 메서드를 직접 호출하는 방법을 사용하여 실행 순서를 보장해야 합니다.

public class DomainTest {
    private ApiTest apiTest = new ApiTest();

    @BeforeEach
    void setUp() {
        System.out.println("DomainTest .setUp1");
        apiTest.setUp();
    }
}

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유