JAVA/JUnit

[JUnit5] 내부동작(1) - 생성자와, 메서드의 매개변수

모든 JUnit들에서는 생성자나 메서드에서 매개변수를 가질 수 없었습니다. (Runner 구현체에서 허용하지 않음)

이번 JUnit5가 되면서 Jupiter의 가장 중요한 변경 사항 중 하나가 바로 테스트 생성자와 메서드 모두 매개변수를 가질 수 있게 된 것입니다! 이를 통해 테스트에서도 의존관계 주입(DI)이 가능해지는 등 더 큰 유연성을 허용할 수 있습니다.

 

특히 'ParameterResolver'매개변수(파라미터)를 런타임 중 동적으로 확인 및 등록하는 역할을 합니다.

현재 JUnit에는 3개의 내장 리졸버가 있습니다.

 

ParameterResolver 구현체 설명
TestInfoParameterResolver 생성자 또는 메서드의 파라미터가 TestInfo 타입인 경우 사용.
이 컨테이너 또는 테스트에 해당되는 정보들
(DisplayName, 테스트 클래스 or 메서드 이름 태그 등)을 제공합니다.
RepetitionInfoParameterResolver 파라미터가 @RepeatedTest, @BeforeEach, @AfterEach와 같이 반복되는 RepetitionInfo 타입인 경우 현재 반복 및 총 반복 횟수에 대한 정보를 제공합니다.
(주의할 점 : 해당 구현체는 @RepeatedTest 컨텍스트 외부에 등록되지 않는다.)
TestReporterParameterResolver 파라미터가 TestPeporter 타입인 경우에 사용.
현제 테스트 실행에 대한 추가 데이터를 보여주는 데 사용. (IDE 인터페이스에 표기)
추가 데이터는 TestExecutionListener.ReportingEntryPublished() 를 통해 보고됩니다.
@DisplayName("TestInfo Demo")
class TestInfoParameterResolverDemo {

    // TestInfo를 생성자를 이용해 클레스 레벨에 주입
    TestInfoDemo(TestInfo testInfo) {
        assertEquals("TestInfo Demo", testInfo.getDisplayName());
    }

    // TestInfo를 @BeforeEach를 이용해 메서드 레벨에 주입
    @BeforeEach
    void init(TestInfo testInfo) {
        String displayName = testInfo.getDisplayName();
        assertTrue(displayName.equals("TEST 1") || displayName.equals("test2()"));
    }

    // TestInfo를 @Test를 이용해 메서드 레벨에 주입
    @Test
    @DisplayName("TEST 1")
    @Tag("my-tag")
    void test1(TestInfo testInfo) {
        assertEquals("TEST 1", testInfo.getDisplayName());
        assertTrue(testInfo.getTags().contains("my-tag"));
    }

    @Test
    void test2() {
    }
}