仕事でSpockを使うことになったがよく分かっていなかったので調べたことをまとめた。
Spockとは
Groovyによるユニットテスト用ツール。JavaにおけるJUnitのようなものらしい。
今の現場のサーバーサイドはJava+Spring Frameworkだが、テストコードのみSpockで動作している。
Groovy基本
Spockを動かす場合はGroovyの基本について理解しておく必要がある。
とはいっても今の現場ではそんなに複雑なものは使っていない。
精々が変数宣言にdef
使うことと最後のセミコロンが不要なことくらい。
Spockの基本的な構造
Spockのテストコードはいくつかのブロックがあり、各ブロックには文字列で補足説明みたいなのを入れられる。
主に使われるのは以下。
given
変数の初期化等をこのブロックで行う。必須ではないらしい。
元々setup
という同様の必須ブロックがあったが、こちらに置き換わった?
whenとthen
when
でテストの処理を指定し、then
で期待値を記述する。両方セットで指定する必要がある。
then
ブロックでは例外をスローするかどうかの確認等も行える。
expect
when
とthen
を兼ね合わせたようなブロック。たまに使われている。
cleanup
テストの最後のリソース開放等を行う。今の現場では使っていない。
when
JUnit4のDataPoints
のような感じで使うブロック。テスト処理は同じで、データや期待値のみ切り替えたい場合に使う。
@Unroll
アノテーションなんかと合わせて使うらしい。
フィクスチャメソッド
JUnitでも@Before
アノテーション等を指定して各テスト前の共通処理を指定したりするが、Spockでは特定のメソッド名を指定することでこれを実現している。
@Before
, @After
, @BeforeClass
, @AfterClass
がそれぞれsetup()
, cleanup()
, setupSpec()
, cleanupSpec()
になる。
ただしSpringなんかと組み合わせる場合、setupSpec()
を実行するタイミングだとまだ@Autowired
で指定した変数が初期化されていないようなので、そのあたりを注意する必要がある。
モック関係
Spockにもモック関係のメソッドがあるようだがまだちょっと詳しくない。