はじめに
JUnit実践入門があれば何も問題ないんだけど、手元にない時が多いのでよく使う奴だけまとめておく。
基本
@Test
public void test1() {
String actual = "hoge";
String expected = "hoge";
assertThat(actual, is(expected));
}
@Test
public void test2() {
String actual = null;
assertThat(actual, is(nullValue()));
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Test
のアノテーションを付けたメソッドが実際のテストメソッド。assertThat()
で期待値と実際の値を比較する。例ではis()
とかnullValue()
を使ってるけど、他にもnot()
とかを使ったりする。
@Before
は@Test
の各メソッドが実行される前に、@After
は@Test
の各メソッドが実行された後に毎回実行される。DBへの接続と切断とか、各テストに共通する処理があればここで書いてやればいい。
@BeforeClass
はすべての@Test
メソッドが実行される前に一度だけ、@AfterClass
はすべての@Test
メソッドが実行された後に一度だけ実行される。@BeforeClass
はテスト用のパラメータをプロパティファイルとかから拾ってくるときとかに使ってる。@AfterClass
はあんまり使ってない気がする……。
例では@Before
とかに何も書いてないけど、ここにもassertThat()
でテストを記述できる。各処理の前、後での状態をテストしたりとかもできる。
テストを複数に分ける場合
@RunWith(Enclosed.class)
public class JUnitTest {
public static class TestClass1 {
@Before
public void setUp() throws Exception {
// TestClass1用の前処理
}
@After
public void tearDown() throws Exception {
// TestClass1用の後処理
}
@Test
public void test() {
String actual = "hoge";
String expected = "hoge";
assertThat(actual, is(expected));
}
}
public static class TestClass2 {
@Before
public void setUp() throws Exception {
// TestClass2用の前処理
}
@After
public void tearDown() throws Exception {
// TestClass2用の後処理
}
@Test
public void test() {
String actual = "fuge";
String expected = "fuge";
assertThat(actual, is(expected));
}
}
}
各テストで前処理とかが異なる場合はテストクラスに@RunWith(Enclosed.class)
を付けたうえでインナークラスを作ればいい。
例ではTestClass1
とTestClass2
で異なる前処理、後処理を実行できる。
便利なんだけど@RunWith(Enclosed.class)
っていうアノテーションの書き方を毎回忘れる。
同じようなテストを繰り返す場合
@RunWith(Theories.class)
public class JUnitTest {
@DataPoints
public static String[] actualValues = {"hoge", "fuge"};
@Theory
public void test(String actualValue) {
int actual = actualValue.length();
int expected = 4;
assertThat(actual, is(expected));
}
}
入力や出力の形式が同じようなテストが複数ある場合はある程度まとめてやったほうがすっきりする。
テストクラスには@RunWith(Theories.class)
を指定し、テストメソッドには@Test
ではなく@Theory
を指定する。テストの入力や出力なんかは@DataPoints
の配列にまとめておき、@Theory
のメソッドの引数には@DataPoints
で指定した型の値を指定しておけば、@Theory
のメソッドが実行された際に@DataPoints
の配列の個数だけテストが実行される。