拡張機能

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