@Before対@BeforeClass対@BeforeEach対@BeforeAll
1前書き
この短いチュートリアルでは、JUnit 4と5の
@ Before
、
@ BeforeClass
、
@ BeforeEach
、および
@ BeforeAll
アノテーションの違いを実際の使用例を使って説明します。
補足的な注釈についても簡単に説明します。
JUnit 4から始めましょう。
2
@前
-
@ Before
アノテーションが付けられたメソッドは、各テストの前に実行されます。
リストを初期化していくつかの値を追加する例を見てみましょう。
@RunWith(JUnit4.class)
public class BeforeAndAfterAnnotationsTest {
//...
private List<String> 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");
}
この場合、各テストを実行する前にテスト環境が適切に設定されていることを確認することが重要です。リストはテストの実行ごとに変更されるためです。
ログ出力を見ると、
init
と
finalize
メソッドがテストごとに1回実行されたことを確認できます。
... startup
... executing another test
... finalize
... startup
... executing test
... finalize
3
@ BeforeClass
各テストの前に高価な共通操作を実行したい場合は、
@ BeforeClass
** を使用してすべてのテストを実行する前に1回だけ実行するのが望ましいです。一般的な高価な操作の例としては、データベース接続の作成やサーバーの起動があります。
データベース接続の作成をシミュレートする簡単なテストクラスを作成しましょう。
@RunWith(JUnit4.class)
public class BeforeClassAndAfterClassAnnotationsTest {
//...
@BeforeClass
public static void setup() {
LOG.info("startup - creating DB connection");
}
@AfterClass
public static void tearDown() {
LOG.info("closing DB connection");
}
}
これらのメソッドは静的である必要があるので、クラスのテストを実行する前に実行する必要があります。
前と同じように、簡単なテストも追加しましょう。
@Test
public void simpleTest() {
LOG.info("simple test");
}
@Test
public void anotherSimpleTest() {
LOG.info("another simple test");
}
今回は、ログ出力を見れば、
setup
と
tearDown
メソッドが一度だけ実行されたことを確認できます。
... startup - creating DB connection
... simple test
... another simple test
... closing DB connection
4
@ BeforeEach
および
@ BeforeAll
-
_ @ BeforeEac
hと
@ BeforeAll
は、JUnit 5の
@ Before
と
@ BeforeClass_
** に相当します。これらの注釈は、混乱を避けるために、より明確な名前に変更されました。
@ BeforeEach
および
@ AfterEach
アノテーションから始めて、これらの新しいアノテーションを使用して以前のクラスを複製しましょう。
@RunWith(JUnitPlatform.class)
class BeforeEachAndAfterEachAnnotationsTest {
//...
private List<String> 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 BeforeAllAndAfterAllAnnotationsTest {
//...
@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
アノテーションの違いと、それぞれの使用時期について説明しました。
いつものように、例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/junit-5[GitHubで利用可能]です。