JUnit5 문서에 언급돼있듯, JUnit4와 JUnit5를 같이 사용하는 것은 가능합니다.
JUnit은 JUnit Vintage 테스트 엔진을 통해 완만한 마이그레이션 경로를 제공하며, JUnit Platform 인프라를 사용하여 JUnit3 및 JUnit4 기반의 기존 테스트를 실행할 수 있습니다. JUnit Jupiter와 관련된 모든 클래스와 어노테이션 명세가 새로운 “org.junit.jupiter” 기본 패키지에 존재하기 때문입니다. classpath에 JUnit4와 JUnit Jupiter가 동시에 있는 것은 어떠한 충돌도 일으키지 않습니다.
하지만 두 시스템을 관리하는 것은 일시적인 해결책입니다. 이 규칙은 JUnit5로 교체될 수 있는 JUnit4에 대해 표시하여 프로젝트의 마이그레이션을 도와줍니다.
다음은 규칙에 의해 JUnit4 어노테이션과 JUnit5가 일치하는 어노테이션 목록입니다.
JUnit4 | JUnit5 |
---|---|
org.junit.Test | org.junit.jupiter.api.Test |
org.junit.Before | org.junit.jupiter.api.BeforeEach |
org.junit.After | org.junit.jupiter.api.AfterEach |
org.junit.BeforeClass | org.junit.jupiter.api.BeforeAll |
org.junit.AfterClass | org.junit.jupiter.api.AfterAll |
org.junit.Ignore | org.junit.jupiter.api.Disabled |
다음 어노테이션은 JUnit5와 동등한 작업을 위해서는 몇가지 재작업이 필요할 수 있습니다. 간단한 어노테이션 교체로는 즉시 동작하지 않습니다:
JUnit4 | JUnit5 |
---|---|
org.junit.experimental.categories.Category | org.junit.jupiter.api.Tag |
org.junit.Rule | org.junit.jupiter.api.extension.ExtendWith |
org.junit.ClassRule | org.junit.jupiter.api.extension.RegisterExtension |
org.junit.runner.RunWith | org.junit.jupiter.api.extension.ExtendWith |
규칙을 어긴 코드
package org.foo;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.runner.RunWith;
@RunWith(MyJUnit4Runner.class)
public class MyJUnit4Test {
@BeforeClass
public static void beforeAll() {
System.out.println("beforeAll");
}
@AfterClass
public static void afterAll() {
System.out.println("AfterAll");
}
@Before
public void beforeEach() {
System.out.println("beforeEach");
}
@After
public void afterEach() {
System.out.println("afterEach");
}
@Test
public void test1() throws Exception {
System.out.println("test1");
}
public interface SomeTests { /* category marker */ }
@Test
@Category(SomeTests.class)
public void test2() throws Exception {
System.out.println("test2");
}
@Test
@Ignore("Requires fix of #42")
public void ignored() throws Exception {
System.out.println("ignored");
}
}
규칙을 준수한 해결책
package org.foo;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MyJUnit5Extension.class)
class MyJUnit5Test {
@BeforeAll
static void beforeAll() {
System.out.println("beforeAll");
}
@AfterAll
static void afterAll() {
System.out.println("afterAll");
}
@BeforeEach
void beforeEach() {
System.out.println("beforeEach");
}
@AfterEach
void afterEach() {
System.out.println("afterEach");
}
@Test
void test1() {
System.out.println("test1");
}
@Test
@Tag("SomeTests")
void test2() {
System.out.println("test2");
}
@Test
@Disabled("Requires fix of #42")
void disabled() {
System.out.println("ignored");
}
}
참고
If you like SONARKUBE, don’t forget to give me a star.