移行ガイド¶
このページはバージョン間で行われた、互換性のない変更の内容とその対処方法について説明します。
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以前では、base1
、base2
、derived1
、derived2
の順にフィールドへの割り当てが行われていました。別の言い方をすると、フィールドの初期化は、同じクラスのsetupメソッドの直前に行われていました。これが0.6では、base1
、derived1
、base2
、derived2
の順に割り当てが行われます。これは、より一般的な順序であり、以前の動作で直面していたいくつかの問題を解決します。また、この変更により新たな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の将来のバージョンでは、おそらく前者のシンタックスを削除し、後者のシンタックスのサポートを強化していく予定です。