拡張機能¶
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参照)
jvmJVMに関する情報(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