SecurityMockMvcResultHandlers

Spring Security は、いくつかの ResultHandler の実装を提供します。Spring Security の ResultHandler の実装を使用するには、次の静的インポートが使用されていることを確認してください。

import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultHandlers.*;

SecurityContext のエクスポート

多くの場合、リポジトリにクエリを実行して、MockMvc リクエストが実際にデータベースに保持されているかどうかを確認します。場合によっては、リポジトリクエリで Spring Data 統合を使用して、現在のユーザーのユーザー名またはその他のプロパティに基づいて結果をフィルタリングします。例を見てみましょう:

リポジトリインターフェース:

private interface MessageRepository extends JpaRepository<Message, Long> {
	@Query("SELECT m.content FROM Message m WHERE m.sentBy = ?#{ principal?.name }")
	List<String> findAllUserMessages();
}

テストシナリオ:

mvc
	.perform(post("/message")
		.content("New Message")
		.contentType(MediaType.TEXT_PLAIN)
	)
	.andExpect(status().isOk());

List<String> userMessages = messageRepository.findAllUserMessages();
assertThat(userMessages).hasSize(1);

リクエストが終了した後、SecurityContextHolder はフィルターチェーンによってクリアされるため、このテストは合格しません。次に、TestSecurityContextHolder を SecurityContextHolder にエクスポートして、必要に応じて使用できます。

mvc
	.perform(post("/message")
		.content("New Message")
		.contentType(MediaType.TEXT_PLAIN)
	)
	.andDo(exportTestSecurityContext())
	.andExpect(status().isOk());

List<String> userMessages = messageRepository.findAllUserMessages();
assertThat(userMessages).hasSize(1);

テストの合間に SecurityContextHolder をクリアすることを忘れないでください。そうしないと、テスト間でリークする可能性があります。