Spockでよく分かっていなかったことまとめ

仕事でSpockを使うことになったがよく分かっていなかったので調べたことをまとめた。

Spockとは

Groovyによるユニットテスト用ツール。JavaにおけるJUnitのようなものらしい。
今の現場のサーバーサイドはJava+Spring Frameworkだが、テストコードのみSpockで動作している。

Groovy基本

Spockを動かす場合はGroovyの基本について理解しておく必要がある。
とはいっても今の現場ではそんなに複雑なものは使っていない。 精々が変数宣言にdef使うことと最後のセミコロンが不要なことくらい。

Spockの基本的な構造

Spockのテストコードはいくつかのブロックがあり、各ブロックには文字列で補足説明みたいなのを入れられる。
主に使われるのは以下。

given

変数の初期化等をこのブロックで行う。必須ではないらしい。
元々setupという同様の必須ブロックがあったが、こちらに置き換わった?

whenとthen

whenでテストの処理を指定し、thenで期待値を記述する。両方セットで指定する必要がある。
thenブロックでは例外をスローするかどうかの確認等も行える。

expect

whenthenを兼ね合わせたようなブロック。たまに使われている。

cleanup

テストの最後のリソース開放等を行う。今の現場では使っていない。

when

JUnit4のDataPointsのような感じで使うブロック。テスト処理は同じで、データや期待値のみ切り替えたい場合に使う。
@Unrollアノテーションなんかと合わせて使うらしい。

フィクスチャメソッド

JUnitでも@Beforeアノテーション等を指定して各テスト前の共通処理を指定したりするが、Spockでは特定のメソッド名を指定することでこれを実現している。
@Before, @After, @BeforeClass, @AfterClassがそれぞれsetup(), cleanup(), setupSpec(), cleanupSpec()になる。
ただしSpringなんかと組み合わせる場合、setupSpec()を実行するタイミングだとまだ@Autowiredで指定した変数が初期化されていないようなので、そのあたりを注意する必要がある。

モック関係

Spockにもモック関係のメソッドがあるようだがまだちょっと詳しくない。

参考

Spock Framework Reference Documentation

1. index - Apache Groovyチュートリアル