MockMvc および Geb

前のセクションでは、MockMvc を WebDriver と使用する方法を説明しました。このセクションでは、ゲブ (英語) を使用して、テストを Groovy-er にします。

なぜ Geb と MockMvc なのでしょうか?

Geb は WebDriver によって支援されているため、WebDriver から得られるのと同じ利点を多く提供します。ただし、Geb は定型コードの一部を処理してくれるため、作業がさらに簡単になります。

MockMvc と Geb のセットアップ

次のように、MockMvc を使用する Selenium WebDriver で Geb Browser を簡単に初期化できます。

def setup() {
	browser.driver = MockMvcHtmlUnitDriverBuilder
		.webAppContextSetup(context)
		.build()
}
これは、MockMvcHtmlUnitDriverBuilder を使用する簡単な例です。より高度な使用箇所については、高度な MockMvcHtmlUnitDriverBuilder を参照してください。

これにより、サーバーとして localhost を参照する URL が、実際の HTTP 接続を必要とせずに、MockMvc インスタンスにリダイレクトされるようになります。他の URL は、通常どおりネットワーク接続を使用してリクエストされます。これにより、CDN の使用を簡単にテストできます。

MockMvc と Geb の使用箇所

これで、通常どおり Geb を使用できますが、アプリケーションをサーブレットコンテナーにデプロイする必要はありません。例: 次のメッセージを作成するためにビューをリクエストできます:

to CreateMessagePage

次に、フォームに入力して送信し、次のようにメッセージを作成します。

when:
form.summary = expectedSummary
form.text = expectedMessage
submit.click(ViewMessagePage)

認識されないメソッド呼び出し、プロパティアクセス、見つからない参照は、現在のページオブジェクトに転送されます。これにより、WebDriver を直接使用するときに必要な定型コードの多くが削除されます。

直接 WebDriver を使用する場合と同様に、これはページオブジェクトパターンを使用することにより、HtmlUnit テストの設計を改善します。前述のように、HtmlUnit および WebDriver でページオブジェクトパターンを使用できますが、Geb ではさらに簡単です。Groovy ベースの新しい CreateMessagePage 実装を検討してください。

class CreateMessagePage extends Page {
	static url = 'messages/form'
	static at = { assert title == 'Messages : Create'; true }
	static content =  {
		submit { $('input[type=submit]') }
		form { $('form') }
		errors(required:false) { $('label.error, .alert-error')?.text() }
	}
}

CreateMessagePage は Page を継承します。Page の詳細については説明しませんが、要約すると、すべてのページに共通の機能が含まれています。このページが見つかる URL を定義します。これにより、次のようにページに移動できます。

to CreateMessagePage

また、指定されたページにいるかどうかを判断する at クロージャーもあります。正しいページにいる場合は、true が返されます。これが、次のように正しいページにいると断言できる理由です。

then:
at CreateMessagePage
errors.contains('This field is required.')
クロージャーでアサーションを使用して、間違ったページにいた場合に問題が発生した場所を判断できるようにします。

次に、ページ内のすべての関心領域を指定する content クロージャーを作成します。jQuery 風の Navigator API (英語) を使用して、関心のあるコンテンツを選択できます。

最後に、次のように、新しいメッセージが正常に作成されたことを確認できます。

then:
at ViewMessagePage
success == 'Successfully created a new message'
id
date
summary == expectedSummary
message == expectedMessage

Geb を最大限に活用する方法の詳細については、ゲブの本 (英語) ユーザーマニュアルを参照してください。