測試 Request 和 Session 作用域的 Bean
Spring 從早期就開始支援 Request 和 Session 作用域的 Bean,您可以按照以下步驟測試您的 request 作用域和 session 作用域的 Bean
-
透過使用
@WebAppConfiguration
註解您的測試類別,確保為您的測試載入WebApplicationContext
。 -
將 Mock Request 或 Session 注入到您的測試實例中,並適當地準備您的測試 fixture。
-
調用您從配置的
WebApplicationContext
中檢索的 Web 組件 (使用相依性注入)。 -
對 Mock 執行斷言。
下一個程式碼片段顯示登入用例的 XML 配置。請注意,userService
Bean 依賴於 request 作用域的 loginAction
Bean。此外,LoginAction
是透過使用 SpEL 運算式實例化的,這些運算式從當前的 HTTP 請求中檢索使用者名稱和密碼。在我們的測試中,我們希望透過 TestContext 框架管理的 Mock 配置這些請求參數。以下列表顯示了此用例的配置
<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
中設定請求參數來設定我們的測試 fixture。當在我們的 userService
上調用 loginUser()
方法時,我們確信使用者服務可以存取當前 MockHttpServletRequest
的 request 作用域 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
}
}
以下程式碼片段與我們之前看到的 request 作用域 Bean 的程式碼片段類似。但是,這次 userService
Bean 依賴於 session 作用域的 userPreferences
Bean。請注意,UserPreferences
Bean 是透過使用 SpEL 運算式實例化的,該運算式從當前的 HTTP Session 中檢索主題。在我們的測試中,我們需要在 TestContext 框架管理的 Mock Session 中配置主題。以下範例顯示了如何執行此操作
<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
屬性來設定我們的測試 fixture。當在我們的 userService
上調用 processUserPreferences()
方法時,我們確信使用者服務可以存取當前 MockHttpSession
的 session 作用域 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
}
}