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