ブロックチェーン・AI・システム開発の株式会社INDETAIL

Spock FrameworkでJerseyのユニットテストを書いてみる

2015.08.20
INDETAIL

はじめに

Javaでユニットテストを作る時に何を使うでしょうか?
JUnitを使うことがほとんどだと思いますが、他にもいくつかあります。
その中にSpock Frameworkがあります。
このテストフレームワークはGroovyベースなので記述量が少なく、JUnit4のTheoryテストやモック、スタブを標準で備えているのでテストを書く事に集中できます。
今回はこのSpock Frameworkを使って、RESTful Webサービスを作ることができるJerseyのユニットテストを書いてみたいと思います。

テスト対象のリソース

まずはテスト対象のソースです。
HTTP GETを受けてメッセージを返すリソースクラスをHelloResource.javaとします。
Model.javaはデータベースなどのMVCのモデルに相当するものです。
ユニットテストでモックにしたいのでコンストラクタではなく、@PostConstructアノテーションで初期化を行っています。
Modelインターフェースの実装クラスはModelImplクラスとしていますが、主題ではないので具体的な実装は省略します。

Spockで書いたテストケース

いきなりですがSpock Frameworkで書いたテストケースです。
上から順に処理の詳細を追っていきます。

jserseyTest

JUnitでJersey Test Frameworkを使う場合はJerseyTestクラスを継承して、オーバーライドしたconfigureメソッドでテスト対象のPOJOを登録します。
Spock FrameworkはjerseyTestクラスを継承していないので代わりにjerseyTestのインスタンスを作成し、そこのconfigureメソッドでテスト対象のHelloResourceクラスを登録します。
targetフィールドをわざわざ用意しているのは、HelloResourceクラスのmodelフィールドをモックで差し替えるためです。

setupSpec / cleanupSpec

Spock FrameworkのsetupSpecメソッドはJUnitのsetUpメソッド、cleanupSpecメソッドはtearDownメソッドに相当するので、jerseyTestのそれぞれのメソッドを呼び出します。

テストメソッド

ここまできてやっとテストメソッドです。
Spock Frameworkのモックはテストメソッド内でなければ作成できないのでwhenブロックでModelをモック化してgetMessageの返り値を"World"に設定します。
続けてandブロックでテスト対象のメソッドを実行して、返り値を変数responseに格納します。
最後にthenブロックで返り値を比較します。Spock Frameworkでは比較式だけでassertされるのでこれでおしまいです。

まとめ

JUnitと比べると簡潔なユニットテストを作ることができました。
また、ちょっとした工夫で依存クラスをモック化できています。
みなさんもSpock FrameworkでJUnitの苦行から解き放たれましょう。

「いいね」ボタンを押すと、最新情報をすぐに確認できます。