拡張機能¶
Spockでは、スペックのライフサイクルの振る舞いを、拡張したり、変更したりすることができる、強力な拡張機構を持っています。この章では、はじめにSpockにビルトインされている機能拡張について説明します。その後で、カスタムの機能拡張を記述する方法を説明します。
ビルトイン機能拡張¶
Spockでビルトインされている拡張機能のほとんどは、アノテーションを通して使用します。これはスペッククラスやメソッドに対して、特定のアノテーションを付与することで動作します。これらは@ExtensionAnnotation
のメタアノテーションを付与することで、独自に指定することも可能です。
Ignore¶
spock.lang.Ignore
を付与することで、一時的にフィーチャメソッド実行しないようにできます。
@Ignore
def "my feature"() { ... }
実行しない理由を記述することもできます。
@Ignore(reason = "TODO")
def "my feature"() { ... }
全てのフィーチャメソッドをignoreするには、クラスに対してアノテーションを付与します。
@Ignore
class MySpec extends Specification { ... }
ほとんどの実行環境では、ignoreされたフィーチャメソッド、スペックは”skipped”としてレポートされます。
IgnoreRest¶
特定のメソッドのサブセット以外すべてをignoreするには、spock.lang.IgnoreRest
アノテーションを使用します。
def "I'll be ignored"() { ... }
@IgnoreRest
def "I'll run"() { ... }
def "I'll also be ignored"() { ... }
@IgnoreRest
は、特定のメソッドのサブセットを、(簡単に)実行する方法がない実行環境で、特に便利な機能です。
IgnoreIf¶
特定の条件下でのみフィーチャメソッドをignoreするには、spock.lang.IgnoreIf
を付与し、プレディケートを指定します。
@IgnoreIf({ System.getProperty("os.name").contains("windows") })
def "I'll run everywhere but on Windows"() { ... }
プリディケートが読み書きしやすいように、クロージャ内で以下のプロパティが使用可能です。
sys
すべてのシステムプロパティのマップ
env
すべての環境変数のマップ
os
オペレーティングシステムに関する情報 (spock.util.environment.OperatingSystem
参照)
jvm
JVMに関する情報(spock.util.environment.Jvm
参照)
上記の例は、os
プロパティを使用することで以下のように記述できます。
@IgnoreIf({ os.windows })
def "I'll run everywhere but on Windows"() { ... }
Requires¶
特定の条件下でのみフィーチャメソッドを実行するには、spock.lang.Requires
を付与し、プレディケートを指定します。
@Requires({ os.windows })
def "I'll only run on Windows"() { ... }
Requires
はプレディケートの意味が逆になっている以外はIgnoreIf
と同じように動作します。一般的には、ignoreする条件を記述するよりも、メソッドを実行する条件を明示する方が、良い作法とされています。
TODO More to follow.
カスタム機能拡張の作成¶
TODO