1. 概要

この短いチュートリアルでは、 @Before @BeforeClass @BeforeEach @BeforeAllの違いについて説明します。 JUnit 4および5の注釈—それらの使用方法の実際的な例。

また、@Afterの補足アノテーションについても簡単に説明します。

JUnit4から始めましょう。

2. @Before

@Beforeアノテーションが付けられたメソッドは、各テストの前に実行されます。これは、テストを実行する前にいくつかの一般的なコードを実行する場合に役立ちます。

リストを初期化して、いくつかの値を追加しましょう。

@RunWith(JUnit4.class)
public class BeforeAndAfterAnnotationsUnitTest {

    // ...

    private List<String> list;

    @Before
    public void init() {
        LOG.info("startup");
        list = new ArrayList<>(Arrays.asList("test1", "test2"));
    }

    @After
    public void teardown() {
        LOG.info("teardown");
        list.clear();
    }
}

各テストの実行後にリストをクリアするために、@Afterで注釈が付けられた別のメソッドも追加したことに注意してください。

次に、リストのサイズを確認するためのテストをいくつか追加しましょう。

@Test
public void whenCheckingListSize_thenSizeEqualsToInit() {
    LOG.info("executing test");
    assertEquals(2, list.size());

    list.add("another test");
}

@Test
public void whenCheckingListSizeAgain_thenSizeEqualsToInit() {
    LOG.info("executing another test");
    assertEquals(2, list.size());

    list.add("yet another test");
}

この場合、各テストを実行する前にテスト環境が適切に設定されていることを確認することが重要です。リストはテストの実行ごとに変更されるためです。

ログ出力を見ると、initおよびteardownメソッドがテストごとに1回実行されたことを確認できます。

... startup
... executing another test
... teardown
... startup
... executing test
... teardown

3.  @BeforeClass

各テストの前に高価な共通操作を実行したい場合は、@BeforeClassを使用してすべてのテストを実行する前に一度だけ実行することをお勧めします。

一般的なコストのかかる操作の例としては、データベース接続の作成やサーバーの起動があります。

データベース接続の作成をシミュレートする簡単なテストクラスを作成しましょう。

@RunWith(JUnit4.class)
public class BeforeClassAndAfterClassAnnotationsUnitTest {

    // ...
    
    @BeforeClass
    public static void setup() {
        LOG.info("startup - creating DB connection");
    }

    @AfterClass
    public static void tearDown() {
        LOG.info("closing DB connection");
    }
}

これらのメソッドはstaticである必要があるため、クラスのテストを実行する前に実行されることに注意してください。

前と同じように、いくつかの簡単なテストも追加しましょう。

@Test
public void simpleTest() {
    LOG.info("simple test");
}

@Test
public void anotherSimpleTest() {
    LOG.info("another simple test");
}

今回、ログ出力を見ると、setupメソッドとtearDownメソッドが1回だけ実行されたことを確認できます。

... startup - creating DB connection
... simple test
... another simple test
... closing DB connection

4. @BeforeEachおよび@BeforeAll

@BeforeEachおよび@BeforeAllは、@Beforeおよび@BeforeClassに相当するJUnit5です。これらの注釈は、混乱を避けるために、より明確な名前に名前が変更されました。

@BeforeEachおよび@AfterEachアノテーションから始めて、これらの新しいアノテーションを使用して以前のクラスを複製してみましょう。

class BeforeEachAndAfterEachAnnotationsUnitTest {

    // ...
    
    private List<String> list;
    
    @BeforeEach 
    void init() {
        LOG.info("startup");
        list = new ArrayList<>(Arrays.asList("test1", "test2"));
    }

    @AfterEach
    void teardown() {
        LOG.info("teardown");
        list.clear();
    }

    // ...
}

ログを確認すると、@Beforeおよび@Afterアノテーションと同じように機能することが確認できます。

... startup
... executing another test
... teardown
... startup
... executing test
... teardown

最後に、他のテストクラスでも同じことを行って、@BeforeAllおよび@AfterAllアノテーションの動作を確認します。

public class BeforeAllAndAfterAllAnnotationsUnitTest {

    // ...
    
    @BeforeAll
    public static void setup() {
        LOG.info("startup - creating DB connection");
    }

    @AfterAll
    public static void tearDown() {
        LOG.info("closing DB connection");
    }

    // ...
}

また、出力は古い注釈と同じです。

... startup - creating DB connection
... simple test
... another simple test
... closing DB connection

5. 結論

この記事では、JUnitの @ Before @BeforeClass @BeforeEach @BeforeAllアノテーションの違いを示しました。それぞれを使用する必要があります。

いつものように、例の完全なソースコードは、GitHubから入手できます。