JUnitの@Before系アノテーションのバージョンによる違い

こんにちは。 エキサイト株式会社の三浦です。

JavaJUnitを使ってユニットテスト(UT)を行うとき、各テストの前に共通で行いたい処理がある場合、 @Before から始まるアノテーションを使えば簡潔に実装することが出来ます。

ですが、 @Before 系のアノテーションには @Before , @BeforeEach , @BeforeClass , @BeforeAll などがあり、使い分けが必要です。

JUnit5以前

JUnit5以前では、 @Before@BeforeClass を使うことになります。 @BeforeEach@BeforeAll は存在していません。

@Before

@Before アノテーションを使用すると、各テストメソッド実行前に @Before アノテーションがついたメソッドが実行されます。 そのため、テストメソッドの個数分実行されます。

public class ServiceTest {
    @Before
    public void setup() {
        // ここに毎処理ごとに必要な処理を追加
    }

    @Test
    @Description("サンプルテスト1")
    public void getSample1() {
        // ここが実行される前に、 `setup` メソッドが実行されます
    }

    @Test
    @Description("サンプルテスト2")
    public void getSample2() {
        // ここが実行される前に、 `setup` メソッドが実行されます
    }
}

@BeforeClass

@BeforeClass アノテーションを使用すると、初回のテスト実行前に @BeforeClass アノテーションがついたメソッドが実行されます。 @Before がテストメソッドの処理ごとに実行されるのに対し、 @BeforeClass はテストクラスの処理ごとに実行されるため、クラスが1つであればメソッドがいくつあっても1回しか実行されません。 また関連し、staticメソッドとしてしか定義できません。

public class ServiceTest {
    @BeforeClass
    public static void setup() {
        // 初回に必要な処理を追加
    }

    @Test
    @Description("サンプルテスト1")
    public void getSample1() {
        // ここが実行される前に、 `setup` メソッドが実行されます
    }

    @Test
    @Description("サンプルテスト2")
    public void getSample2() {
        // サンプルテスト1の前で `setup` メソッドが実行されている場合、この処理の前に `setup` メソッドは実行されません
    }
}

JUnit5以後

JUnit以後はアノテーション名が変わり、 @Before@BeforeEach に、 @BeforeClass@BeforeAll になりました。 IntelliJ IDEAの補完等にも出てこなくなってしまうので、注意しましょう。

名前は変わりましたが、使い方は同じです。

まとめ

JUnitのバージョンで名前が変わるため、 @Before 系のアノテーションについて調べ、いざ使ってみようと思ったらエラーになった…ということも起きうると思います(実体験)。 機能自体はとても有用で使いどころもあるので、ぜひ使っていきましょう。