JUnit 4からJUnit 5への移行

1.概要

この記事では、JUnit 4から最新のJUnit 5リリースへの移行方法について説明します。2つのバージョンのライブラリーの違いについて概説します。

JUnit 5の使用に関する一般的なガイドラインについては、私たちの記事へのリンクを見てください:/junit-5[ここ]。

2. JUnit 5の利点

以前のバージョンから始めましょう - JUnit 4には明らかな制限がいくつかあります。

  • フレームワーク全体が単一のjarライブラリに含まれていました。全体

特定の機能しかない場合でも、ライブラリをインポートする必要があります。 必須。 JUnit 5では、より細かい粒度が得られ、インポートできるものだけが取り込まれます。 必要です ** 1人のテストランナーは一度にJUnit 4のテストしか実行できません(例:

SpringJUnit4ClassRunner または Parameterized )。 JUnit 5では複数が可能 同時に働くランナー ** JUnit 4はJava 7を超えて進歩したことはなく、多くの機能を見逃して

Java 8から。 JUnit 5はJava 8の機能をうまく利用する

JUnit 5の背後にある考え方は、これらの欠点のほとんどを解決するためにJUnit 4を完全に書き直すことでした。

3.違い

JUnit 4はJUnit 5を構成するモジュールに分割されました。

  • JUnitプラットフォーム - このモジュールは私たちがすべての拡張フレームワークを対象としています

テストの実行、発見、報告に興味があるかもしれません JUnit Vintage - ** このモジュールはJUnitとの下位互換性を保つ

4あるいはJUnit 3

3.1. アノテーション

JUnit 5では、その注釈内に重要な変更が加えられています。 ** 最も重要なのは、期待値を指定するために @ Test アノテーションを使用できなくなったことです。

JUnit 4の expected パラメーター

@Test(expected = Exception.class)
public void shouldRaiseAnException() throws Exception {
   //...
}

これで、メソッド assertThrows を使用できます。

public void shouldRaiseAnException() throws Exception {
    Assertions.assertThrows(Exception.class, () -> {
       //...
    });
}

JUnit 4の timeout 属性:

@Test(timeout = 1)
public void shouldFailBecauseTimeout() throws InterruptedException {
    Thread.sleep(10);
}

さて、JUnit 5の assertTimeout メソッドは次のとおりです。

@Test
public void shouldFailBecauseTimeout() throws InterruptedException {
    Assertions.assertTimeout(Duration.ofMillis(1), () -> Thread.sleep(10));
}

JUnit 5内で変更されたその他の注釈

  • @ Before アノテーションは @ BeforeEach に改名されました

  • @ After アノテーションは @ AfterEach に改名されました

  • @ BeforeClass アノテーションは @ BeforeAll に改名されました

  • @ AfterClass アノテーションは @ AfterAll に改名されました

  • @ @無視 アノテーションは @無効 に名前が変更されました

3.2. アサーション

JUnit 5では、アサーションメッセージをラムダに書き込むことができるようになりました。遅延評価では、必要になるまで複雑なメッセージ構成をスキップすることができます。

@Test
public void shouldFailBecauseTheNumbersAreNotEqual__lazyEvaluation() {
    Assertions.assertTrue(
      2 == 3,
      () -> "Numbers " + 2 + " and " + 3 + " are not equal!");
}

JUnit 5ではアサーションをグループ化することもできます。

@Test
public void shouldAssertAllTheGroup() {
    List<Integer> list = Arrays.asList(1, 2, 4);
    Assertions.assertAll("List is not incremental",
        () -> Assertions.assertEquals(list.get(0).intValue(), 1),
        () -> Assertions.assertEquals(list.get(1).intValue(), 2),
        () -> Assertions.assertEquals(list.get(2).intValue(), 3));
}

3.3. 仮定

新しい Assumptions クラスは現在 org.junit.jupiter.api.Assumptions にあります。 JUnit 5はJUnit 4の既存の仮定メソッドを完全にサポートし、特定のシナリオでのみいくつかのアサーションを実行できるようにする一連の新しいメソッドも追加します。

@Test
public void whenEnvironmentIsWeb__thenUrlsShouldStartWithHttp() {
    assumingThat("WEB".equals(System.getenv("ENV")),
      () -> {
          assertTrue("http".startsWith(address));
      });
}

3.4. タグ付けとフィルタリング

JUnit 4では、 @ Category アノテーションを使ってテストをグループ化することができました。

JUnit 5では、 @ Category アノテーションは @ Tag アノテーションに置き換えられます。

@Tag("annotations")
@Tag("junit5")
@RunWith(JUnitPlatform.class)
public class AnnotationTestExampleTest {
   /** ...** /}

maven-surefire-plugin を使用して特定のタグを含める/除外することができます。

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <properties>
                    <includeTags>junit5</includeTags>
                </properties>
            </configuration>
        </plugin>
    </plugins>
</build>

3.5. テストを実行するための新しい注釈

@ RunWith は、テストコンテキストを他のフレームワークと統合するため、またはJUnit 4のテストケースにおける全体的な実行フローを変更するために使用されました。

JUnit 5では、 @ ExtendWith アノテーションを使用して同様の機能を提供できます。

例として、JUnit 4のSpring機能を使うには、次のようにします。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
  {"/app-config.xml", "/test-data-access-config.xml"})
public class SpringExtensionTest {
   /** ...** /}

さて、JUnit 5では、これは単純な拡張です。

@ExtendWith(SpringExtension.class)
@ContextConfiguration(
  { "/app-config.xml", "/test-data-access-config.xml" })
public class SpringExtensionTest {
   /** ...** /}

3.6新しいテストルールの注釈

JUnit 4では、テストに特別な機能を追加するために @ Rule および@ ClassRule アノテーションが使用されました。

JUnit 5では、 @ ExtendWith アノテーションを使って同じロジックを再現できます。

たとえば、JUnit 4にテストの前後にログトレースを書き込むためのカスタムルールがあるとします。

public class TraceUnitTestRule implements TestRule {

    @Override
    public Statement apply(Statement base, Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
               //Before and after an evaluation tracing here
                ...
            }
        };
    }
}

そしてそれをテストスイートに実装します。

@Rule
public TraceUnitTestRule traceRuleTests = new TraceUnitTestRule();

JUnit 5では、もっと直感的に同じことを書くことができます。

public class TraceUnitExtension implements AfterEachCallback, BeforeEachCallback {

    @Override
    public void beforeEach(TestExtensionContext context) throws Exception {
       //...
    }

    @Override
    public void afterEach(TestExtensionContext context) throws Exception {
       //...
    }
}

パッケージ org.junit.jupiter.api.extensionで利用可能なJUnit 5の AfterEachCallback および BeforeEachCallback__インターフェースを使用して、テストスイートにこのルールを簡単に実装します。

@RunWith(JUnitPlatform.class)
@ExtendWith(TraceUnitExtension.class)
public class RuleExampleTest {

    @Test
    public void whenTracingTests() {
       /** ...** /    }
}

3.7. JUnit 5ヴィンテージ

JUnit Vintageは、JUnit 5またはJUnit 4のテストをJUnit 5のコンテキスト内で実行することで、JUnitテストの移行を支援します。

JUnit Vintage Engineをインポートすることで使用できます。

<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <version>${junit5.vintage.version}</version>
    <scope>test</scope>
</dependency>

4.まとめ

この記事で見たように、JUnit 5はモジュール式で現代的なJUnit 4フレームワークです。これら2つのバージョンの主な違いを紹介し、一方から他方への移行方法を示唆しました。

このチュートリアルの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5[GitHubに乗って]にあります。

前の投稿:@Componentと@Repository、およびSpringの@Service
次の投稿:JAX-RSクライアントwith Jersey