移行ガイド

このページはバージョン間で行われた、互換性のない変更の内容とその対処方法について説明します。

0.7

クライアントコードはSpock 0.7で再コンパイルする必要があります。これにはサードパーティの機能拡張やベースクラスも含まれます。

互換性のないソースコードの変更はありません。

0.6

クラスの初期化順序

注釈

これはSpecificationクラスを他のクラスから継承している場合に影響があります。

以下のスペックを例に説明します。

class Base extends Specification {
    def base1 = "base1"
    def base2

    def setup() { base2 = "base2" }
}

class Derived extends Base {
    def derived1 = "derived1"
    def derived2

    def setup() { derived2 = "derived2" }
}

0.5以前では、base1base2derived1derived2の順にフィールドへの割り当てが行われていました。別の言い方をすると、フィールドの初期化は、同じクラスのsetupメソッドの直前に行われていました。これが0.6では、base1derived1base2derived2の順に割り当てが行われます。これは、より一般的な順序であり、以前の動作で直面していたいくつかの問題を解決します。また、この変更により新たなJUnitのTestRuleのサポートを追加することができました。以下のコードは、0.6では正しく動作しません。

class Base extends Specification {
    def base

    def setup() { base = "base" }
}

class Derived extends Base {
    def derived = base + "derived" // base is not yet set
}

この問題を回避するには、baseをフィールドで初期化するか、derivedへの割り当てをsetupメソッドに移動するかのどちらかになります。

@Unrollのネーミングパターンのシンタックス

注釈

これは0.5から変更はありませんが、0.6-SNAPSHOTから変更があります。

注釈

これは、Groovyの1.8と2.0のバージョンで影響を与えます。

0.5ではネーミングパターンはStringベースでした。

@Unroll("maximum of #a and #b is #c")
def "maximum of two numbers"() {
    expect:
    Math.max(a, b) == c

    where:
    a | b | c
    1 | 2 | 2
}

0.6-SNAPSHOTでは、これがGStringを返すクロージャに変更されました。

@Unroll({"maximum of $a and $b is $c"})
def "maximum of two numbers"() { ... }

様々な理由により、新しいシンタックスは期待したとおりに動作しませんでした。そのため、最終的には元のStringベースの指定に戻しています。また、このStringベースのシンタックス改善について、@Unrollの改善を参照してください。

Hamcrestマッチャーのシンタックス

注釈

これは、Groovyの1.7から、1.8または2.0のバージョンに移行するユーザーに影響します。

SpockはHamcrestのマッチャーを使用するために、非常に綺麗なシンタックスを提供しています。

import static spock.util.matcher.HamcrestMatchers.closeTo

...

expect:
answer closeTo(42, 0.001)

Groovy 1.7と1.8の間で行われた変更により、このシンタックスは多くの場合に正しく動作しなくなりました。例えば、次のコードは正しく動作しません。

expect:
object.getAnswer() closeTo(42, 0.001)

この問題を回避するには、HamcrestSupport.thatを使用します。

import static spock.util.matcher.HamcrestSupport.that

...

expect:
that answer, closeTo(42, 0.001)

Spockの将来のバージョンでは、おそらく前者のシンタックスを削除し、後者のシンタックスのサポートを強化していく予定です。