spring of life

技術、ときどき日常のブログ(予定)

JUnit でパラメーターを変えながらテストする

あるメソッドのテストで、引数のパターンをいろいろ変えながらテストする時に、パラメーターごとに

@Test
public void testHoge1() {
  assertEquals(hoge(pattern1), fuga);
}

@Test
public void testHoge2() {
  assertEquals(hoge(pattern2), fuga);
}

@Test
...

みたいに引数のパターンごとに書いてて、面倒だし、コードが長くなるな〜と思ってて困ってたんだが、

@Parameterizedっていうのがあるっぽいね

javaworld.helpfulness.jp

自分が書いてるのは、日付のフォーマットチェック(yyy-mm-ddのみOK)だけど、↓のような感じになる

@RunWith(Parameterized.class)
public static class CheckDateTest {
  private String date;
  private boolean expected;
  private InputChecker inputChecker;

  public CheckDateTest(String date, boolean expected) {
    this.date = date;
    this.expected = expected;
    inputChecker = new InputChecker();
  }

  @Parameters(name = "{0} is {1}")
  public static Iterable<Object[]> getParameters() {
    return Arrays.asList(new Object[][] {
      {"1000-01-01", true},
      {"1000/01/01", false},
      {"01-01-1000", false},
      {"01/01/1000", false},
      {"10000101", false},
      {"1000-13-01", false},
      {"1000-01-00", false},
      {"1000-13-00", false}
    });
  }

  @Test
  public void testCheckDate() {
    assertEquals(inputChecker.checkDate(date), expected);
  }
}


まだまだ@RunWithのところにいろんなクラス指定できるらしいから調べてみた方がいいかも?

例えば、Enclosed.classを使うと、@RunWithを入れ子にできたりするっぽい

@RunWith(Enclosed.class)
public class InputCheckerTest extends TestCase {
  @RunWith(Parameterized.class)
  public static class CheckDateTest {
    ...
  }
  
  @RunWith(Parameterized.class)
  public static class CheckPriceTest {
    ...
  }
}

こんな感じでね!