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の書き方をさらに詳しく知りたい方は、公式ドキュメント(ただし英語)を参照頂きたい。