リクエストおよびセッションスコープの Bean のテスト

Spring は初期からリクエストおよびセッションスコープの Bean をサポートしており、次の手順に従ってリクエストスコープおよびセッションスコープの Bean をテストできます。

  • テストクラスに @WebAppConfiguration のアノテーションを付けて、WebApplicationContext がテスト用にロードされていることを確認します。

  • モックリクエストまたはセッションをテストインスタンスに挿入し、必要に応じてテストフィクスチャを準備します。

  • 構成済みの WebApplicationContext から取得した Web コンポーネントを呼び出します(依存性注入を使用)。

  • モックに対してアサーションを実行します。

次のコードスニペットは、ログインユースケースの XML 構成を示しています。userService Bean は、リクエストスコープの loginAction Bean に依存していることに注意してください。また、LoginAction は、現在の HTTP リクエストからユーザー名とパスワードを取得する SpEL 式を使用してインスタンス化されます。このテストでは、TestContext フレームワークによって管理されるモックを介してこれらのリクエストパラメーターを構成します。次のリストは、このユースケースの構成を示しています。

リクエストスコープの Bean 構成
<beans>

	<bean id="userService" class="com.example.SimpleUserService"
			c:loginAction-ref="loginAction"/>

	<bean id="loginAction" class="com.example.LoginAction"
			c:username="#{request.getParameter('user')}"
			c:password="#{request.getParameter('pswd')}"
			scope="request">
		<aop:scoped-proxy/>
	</bean>

</beans>

RequestScopedBeanTests では、UserService (つまりテスト対象)と MockHttpServletRequest の両方をテストインスタンスに注入します。requestScope() テストメソッド内で、提供された MockHttpServletRequest でリクエストパラメーターを設定することにより、テストフィクスチャをセットアップします。userService で loginUser() メソッドが呼び出されると、ユーザーサービスが現在の MockHttpServletRequest (つまり、パラメーターを設定したもの)のリクエスト範囲 loginAction にアクセスできることが保証されます。その後、ユーザー名とパスワードの既知の入力に基づいて、結果に対してアサーションを実行できます。次のリストは、そのメソッドを示しています。

  • リクエストスコープの Bean テスト

  • Kotlin

@SpringJUnitWebConfig
class RequestScopedBeanTests {

	@Autowired UserService userService;
	@Autowired MockHttpServletRequest request;

	@Test
	void requestScope() {
		request.setParameter("user", "enigma");
		request.setParameter("pswd", "$pr!ng");

		LoginResults results = userService.loginUser();
		// assert results
	}
}
@SpringJUnitWebConfig
class RequestScopedBeanTests {

	@Autowired lateinit var userService: UserService
	@Autowired lateinit var request: MockHttpServletRequest

	@Test
	fun requestScope() {
		request.setParameter("user", "enigma")
		request.setParameter("pswd", "\$pr!ng")

		val results = userService.loginUser()
		// assert results
	}
}

次のコードスニペットは、リクエストスコープの Bean について先ほど見たものに似ています。ただし、今回は、userService Bean はセッションスコープの userPreferences Bean に依存しています。UserPreferences Bean は、現在の HTTP セッションからテーマを取得する SpEL 式を使用してインスタンス化されることに注意してください。このテストでは、TestContext フレームワークによって管理されるモックセッションでテーマを構成する必要があります。次の例は、その方法を示しています。

セッションスコープの Bean 構成
<beans>

	<bean id="userService" class="com.example.SimpleUserService"
			c:userPreferences-ref="userPreferences" />

	<bean id="userPreferences" class="com.example.UserPreferences"
			c:theme="#{session.getAttribute('theme')}"
			scope="session">
		<aop:scoped-proxy/>
	</bean>

</beans>

SessionScopedBeanTests では、UserService と MockHttpSession をテストインスタンスに注入します。sessionScope() テストメソッド内で、提供された MockHttpSession で予想される theme 属性を設定することにより、テストフィクスチャをセットアップします。userService で processUserPreferences() メソッドが呼び出されると、ユーザーサービスが現在の MockHttpSession のセッションスコープの userPreferences にアクセスできることが保証され、構成されたテーマに基づいて結果に対してアサーションを実行できます。次の例は、そのメソッドを示しています。

  • セッションスコープの Bean テスト

  • Kotlin

@SpringJUnitWebConfig
class SessionScopedBeanTests {

	@Autowired UserService userService;
	@Autowired MockHttpSession session;

	@Test
	void sessionScope() throws Exception {
		session.setAttribute("theme", "blue");

		Results results = userService.processUserPreferences();
		// assert results
	}
}
@SpringJUnitWebConfig
class SessionScopedBeanTests {

	@Autowired lateinit var userService: UserService
	@Autowired lateinit var session: MockHttpSession

	@Test
	fun sessionScope() {
		session.setAttribute("theme", "blue")

		val results = userService.processUserPreferences()
		// assert results
	}
}