リクエストおよびセッションスコープの Bean のテスト
Spring は初期からリクエストおよびセッションスコープの Bean をサポートしており、次の手順に従ってリクエストスコープおよびセッションスコープの Bean をテストできます。
テストクラスに
@WebAppConfiguration
のアノテーションを付けて、WebApplicationContext
がテスト用にロードされていることを確認します。モックリクエストまたはセッションをテストインスタンスに挿入し、必要に応じてテストフィクスチャを準備します。
構成済みの
WebApplicationContext
から取得した Web コンポーネントを呼び出します(依存性注入を使用)。モックに対してアサーションを実行します。
次のコードスニペットは、ログインユースケースの XML 構成を示しています。userService
Bean は、リクエストスコープの loginAction
Bean に依存していることに注意してください。また、LoginAction
は、現在の HTTP リクエストからユーザー名とパスワードを取得する SpEL 式を使用してインスタンス化されます。このテストでは、TestContext フレームワークによって管理されるモックを介してこれらのリクエストパラメーターを構成します。次のリストは、このユースケースの構成を示しています。
<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
にアクセスできることが保証されます。その後、ユーザー名とパスワードの既知の入力に基づいて、結果に対してアサーションを実行できます。次のリストは、そのメソッドを示しています。
Java
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 フレームワークによって管理されるモックセッションでテーマを構成する必要があります。次の例は、その方法を示しています。
<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
にアクセスできることが保証され、構成されたテーマに基づいて結果に対してアサーションを実行できます。次の例は、そのメソッドを示しています。
Java
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
}
}