@Before対@BeforeClass対@BeforeEach対@BeforeAll

@Before vs @BeforeClass vs @BeforeEach vs @BeforeAll

1. 前書き

この短いチュートリアルでは、JUnit 4および5の@Before@BeforeClass@BeforeEach、および@BeforeAllアノテーションの違いを説明します。実際の例を示します。それらを使用します。

また、@Afterの補完的な注釈についても簡単に説明します。

JUnit4から始めましょう。

2. @Before

Methods annotated with the @Before annotation are executed before each test.これは、テストを実行する前にいくつかの一般的なコードを実行する場合に役立ちます。

リストを初期化していくつかの値を追加する例を見てみましょう。

@RunWith(JUnit4.class)
public class BeforeAndAfterAnnotationsUnitTest {

    // ...

    private List list;

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

    @After
    public void finalize() {
        LOG.info("finalize");
        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");
}

この場合、リストはテストの実行ごとに変更されるため、it’s crucial to make sure that test environment is properly set up before running each testになります。

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

... startup
... executing another test
... finalize
... startup
... executing test
... finalize

3. @BeforeClass

各テストの前に高価な一般的な操作を実行する場合は、it’s preferable to execute it only once before running all tests using @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");
    }
}

these methods have to be 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 and @BeforeAll are the JUnit 5 equivalents of @Before and @BeforeClass。 これらの注釈は、混乱を避けるために、より明確な名前に変更されました。

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

@RunWith(JUnitPlatform.class)
class BeforeEachAndAfterEachAnnotationsUnitTest {

    // ...

    private List list;

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

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

    // ...
}

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

... startup
... executing another test
... finalize
... startup
... executing test
... finalize

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

@RunWith(JUnitPlatform.class)
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アノテーションの違いと、それぞれをいつ使用するかを示しました。

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