前置き
- 初投稿です。よろしくお願いします。
-
「JUnit実践入門 ~体系的に学ぶユニットテストの技法」 を読んで要点をまとめました!っていう記事はすでにいっぱいあるんですが、
これの出版以降のバージョンだと、(すくなくとも日本語での)情報がグッと減るので書いてみる事にしました。 - パラメータ化テストについては、「JUnit実践入門」では第8章で説明されています。
本題
JUnit4.11まで
- テストメソッドの引数と
@DataPoints
が付与されたフィールドとの対応付けは、型でのみ判断されていました。 - 型が一致すればすべてのテストデータが適用されてしまうので、色々と不自由なところがありました。
JUnit4.12
-
@DataPoints
にラベル(複数も可)をつけることができ、
そのラベルを@FromDataPoints
で参照することで、
テストメソッドの引数とテストデータの対応付けが自由に指定できるようになりました。
ちなみに題材がスネークケースとかキャメルケースとかなのは、「JUnit実践入門」の演習問題の一番最初をやっていたからです。
ParameterizedTest.java
// JUnit4.12の場合
@RunWith(Enclosed.class)
public class ParameterizedTest {
@RunWith(Theories.class)
public static class isSnakeCaseのテスト {
@DataPoints({"snake", "notCamel"})
public static String[] snakes = new String[] {
"hello_world", "an_apple_and_a_banana"
};
@DataPoints({"camel", "notSnake"})
public static String[] camels = new String[] {
"helloWorld", "anAppleAndABanana"
};
@DataPoints({"notSnake", "notCamel"})
public static String[] others = new String[] {
null, "", "apple"
};
// snakesの要素だけが使用される
@Theory
public void isSnakeCaseのテスト_trueになる場合(
@FromDataPoints("snake") String snake) {
// Exercise & Verify
assertThat(StringUtils.isSnakeCase(snake), is(true));
}
// camelsとothersの要素が使用される
@Theory
public void isSnakeCaseのテスト_falseになる場合(
@FromDataPoints("notSnake") String notSnake) {
// Exercise & Verify
assertThat(StringUtils.isSnakeCase(notSnake), is(false));
}
}
}
Eclipseでやるとboxingのwarningが出るので、この場合は assertThat()
よりもassertTrue()
(あるいはassertFalse()
)を使った方がいいかもしれません。
あとがき
- 便利そうだけど、実務でどのくらい使えるかはわかんないです。
- そろそろJUnit4.13とかJUnit5とかも出るんですかね
- 誤字やおかしいところなどあればご指摘ください。
参考
-
JUnit4.12に追いつこう(周回遅れで) - 日々常々
日本語の情報だとこことかがひっかかりますが、この件に関しては具体的なコード例がなかったのでこの記事を書いてみました。 -
FromDataPoints (JUnit API)
公式のJavdoc