はじめに
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の配列の個数だけテストが実行される。