Sesson管理にDBを使っている際のMockMvcによるSessionのテスト【Spring Boot】

MockMvcでのSessionテストアイキャッチプログラム
スポンサーリンク

Spring Bootで単体テストを実装中、MockMvcを使ったテストを行いました。パラメータの受け渡しなどは実装できていたのですが、Sessionに値を設定した状態のテストをしようとした際に問題が発生。

今回のプロジェクトではSessionをデータベース(MySQL)を使って管理していました。セッション管理をデフォルトに戻すとちゃんとセッションに初期値を設定できるのですが、データベース管理だとどうしてもうまくいきません。

この記事ではSession管理にデータベースを使った際に、MockMvcを使ってうまくテストできるようにする方法を書いていきます。

結論:@AutoConfigureMockMvcは使わない

まず結論から書いていくと、MockMvcの初期化方法を手動で行う必要があります。@AutoConfigureMockMvcでの初期化ではだめでした。

うまくいくコードは以下の通りです。

@SpringBootTest
public class MockMvcTest {

	private MockMvc mockMvc;

	@Autowired
	WebApplicationContext webApplicationContext;

	@BeforeEach
	void setup() {
		mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
	}
	
	@Test
	void testSession() throws Exception {
		// @formatter:off
		this.mockMvc.perform(get("/login").sessionAttr("input", "input"))
				.andExpect(request().sessionAttribute("output", "output"))
				.andExpect(request().sessionAttribute("input", "input"));
		// @formatter:on
	}
}

うまく行かなかった例

こちらがもともと書いていたコード。MockMvcを@AutoConfigureMockMvcで初期化して使っていました。この手法でも、Sessionをデフォルトのままアプリケーションサーバで管理している場合はうまくいくのですが、データベースで管理していると失敗します。

// DBでセッション管理しているとうまく行かない例
@SpringBootTest
@AutoConfigureMockMvc
public class MockMvcTest {

	@Autowired
	private MockMvc mockMvc;
	
	@Test
	void testSession() throws Exception{
		// @formatter:off
		this.mockMvc.perform(get("/login").sessionAttr("input", "input"))
			// ここでエラー発生。SessionをControllerから受け取れない
			.andExpect(request().sessionAttribute("output", "output"))
			// こっちでもエラー。渡したはずのセッション情報がなくなった
			.andExpect(request().sessionAttribute("input", "input"));
		// @formatter:on

	}
}

おすすめ

せっかくJavaを勉強しているのなら、資格を取得してみませんか?OCJP(Oracle Certified Java Programmer) SilverはJavaの基本を学ぶのに適した資格です。初心者はもとより、中堅の人でも普段使わない機能を勉強するきっかけになると思います。

残念なことに試験は有料で、しかも結構高い(税抜26,600円)です。

しかし、お勤めの会社によっては費用を負担してくれるところもあるでしょうし、場合によっては報奨金まで出してくれるはずです。(私の会社は初回の試験料負担+報奨金を出してくれました)

私のおすすめな勉強方法は徹底攻略Java SE 11 Silver問題集を読むことです。問題集ですが、解説が充実しています。

徹底攻略Java SE 11 Silver問題集[1Z0-815]対応 徹底攻略シリーズ | 志賀 澄人 | 工学 | Kindleストア | Amazon
Amazonで志賀 澄人の徹底攻略Java SE 11 Silver問題集[1Z0-815]対応 徹底攻略シリーズ。アマゾンならポイント還元本が多数。一度購入いただいた電子書籍は、KindleおよびFire端末、スマートフォンやタブレットなど、様々な端末でもお楽しみいただけます。

大体30時間くらいの勉強で合格できました。

コメント

タイトルとURLをコピーしました