given で Spock Mock のメソッド引数を宣言する

前回のエントリーを書いていて気づいたこと、というかトラブったこと。

Spock で標準出力をテストする - Java開発のんびり日記

Mock のメソッド引数の宣言位置

println メソッドが1回呼ばれることを Mock を使って確認するテストです。
今回注目するのが、そのメソッドに渡される引数の変数宣言の位置です。

class SystemOutTest extends spock.lang.Specification {

    def "標準出力にきちんと文字列が出力される"() {
        given:
        def savedSystemOut = System.out
        
        def printStream = Mock(PrintStream)
        System.out = printStream
        String msg = 'sample'
        
        when:
        // String msg = 'sample'
        outputSample()
        
        then:
        // String msg = 'sample'
        1 * printStream.println(msg)
        
        cleanup:
        System.out = savedSystemOut
    }

    void outputSample() {
        System.out.println('sample');
    }
}

Mock のメソッド引数の宣言は given

結果から言うと、given で宣言しないと期待したテスト結果は得られません。
(12行目、16行目でコメントアウトしている位置ではダメです)

when や then で宣言、値セットしても、評価時には使用されません。
つまり、変数は null としてメソッド引数に渡されているようです。

考えてみると、then はもちろんのこと when よりも、given で宣言しておくのが適切だと思います。
が、テストコードを書いているときにはついつい、その場で宣言してしまいそうなので、注意しないといけないです。