LoginSignup
22
20

More than 3 years have passed since last update.

JUnit4でよく使うやつ個人用まとめ

Last updated at Posted at 2017-09-18

はじめに

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)を付けたうえでインナークラスを作ればいい。
例ではTestClass1TestClass2で異なる前処理、後処理を実行できる。
便利なんだけど@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の配列の個数だけテストが実行される。

22
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
20