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 で宣言しておくのが適切だと思います。
が、テストコードを書いているときにはついつい、その場で宣言してしまいそうなので、注意しないといけないです。