こんにちは。 エキサイト株式会社の三浦です。
JavaでJUnitを使ってユニットテスト(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 系のアノテーションについて調べ、いざ使ってみようと思ったらエラーになった…ということも起きうると思います(実体験)。
機能自体はとても有用で使いどころもあるので、ぜひ使っていきましょう。