任意の条件でテストをスキップする

Spock にも JUnit4 の assumeThat のように ある条件の時だけ テストをスキップする機能が 0.5-groovy-1.8 で追加されています。
前回 のようにわざわざ設定を変更する必要がないので、環境に依存したテスト等には非常に便利です。

例えば、実行環境が Windows 以外の時だけ処理をスキップする (Windows のときだけ処理する) 場合は

package com.bluepapa32;

import spock.lang.*;

class HelloSpec extends Specification {

    @IgnoreIf({ properties['os.name'] !=~ /Windows.*/ })
    def 'Windows の場合 ○○する'() {
        expect: true
    }
}
のように フィーチャーメソッドに @IgnoreIf を付けます。
@IgnoreIf の引数には 真偽値を返すクロージャを渡します。
クロージャが true を返した場合、処理をスキップします。
このクロージャ内では静的変数、静的メソッド もしくは 次の暗黙オブジェクトだけが使えます。
変数名
properties System プロパティ
env 環境変数
javaVersion Java バージョン
残念ながら Specification のフィールドは参照できないようです。

この @IgnoreIf は Annotation Driven Extensions という Spock の拡張機能を使って実現されているようです。
Annotation Driven Extensions は アノテーションを付けることで AOP のように処理を追加する機能です。
Junit の Rule に少し似ていますが、Rule よりも もう少し高機能なようです。まだ、ちゃんと調べていないですが...
JUnit の Rule も そうですが、アノテーションってこんなに使えるものなんですね。
工夫次第でいろいろと役に立つモジュールができそうですね。
これはテストコードだけでなくプロダクトコードにも ぜひ 活用してみたいですね。