ensureThrowsを用いた例外の検証
では、先ほどのFilePathクラスに関連したシナリオをもう1つ紹介しよう。FilePathクラスは、コンストラクタにnullを渡されるとIllegalArgumentExceptionが発生する、という仕様がある。その仕様を記述したのが以下のシナリオだ。
scenario "ファイルパスとしてnullを渡すと、例外が発生する", {
given "nullをファイルパスとして渡す", {
passnull = {
filePath = new FilePath(null)
}
}
then "IllegalArgumentExceptionが発生する", {
ensureThrows(IllegalArgumentException.class) {
pathnull()
}
}
}
givenメソッドに渡したクロージャ内では、passnullという名前でコードブロックを作成し、FilePathのコンストラクタにnullを渡している。
thenメソッドに渡したクロージャ内がポイントだ。passnullを実行し、IllegalArgumentExceptionが発生することを、「ensureThrows」というメソッドを用いて検証している。
ensureThrows()は、第1引数に例外クラスを取り、渡されたクロージャを実行した結果、その例外が発生することを検証するためのメソッドだ。
ensure()メソッドの紹介
ほぼ同様の構文を用いるensure()というメソッドも存在する。構文は以下の通り。
ensure(値) {
...値を検証するための式...
}
ensure()メソッド内では以下のようなメソッドを使用することができ、きめ細やかな値の検証を行うことができる。
- isNull、isNotNull……値がnull/非nullか
- isA<型>……値の型を検証
- isEqualTo(value)、isNotEqualTo(value)……値が一致するか
- isTrue、isFalse……値がtrue/falseか
- contains、has……指定した値を持つオブジェクト/コレクションか
- doesNotContain、doesNotHave……containsの逆
- startsWith、endsWith……文字列が、指定した文字列で始まっている/終わっているか
- and……これらの式をつなぐ
以下に、ensure()の使い方をいくつか示す。
ensure("test"){
contains("est")
}
ensure([1,2,3]){
contains(3)
and
contains([2,3])
}
ensure()の使い方も含め、DSLの書き方をさらに詳しく知りたい方は、公式ドキュメント(ただし英語)を参照頂きたい。