測試請求和會話作用域的 Bean
Spring 從早期就支援請求和會話作用域的 Bean,你可以透過以下步驟測試你的請求和會話作用域的 Bean:
-
透過使用
@WebAppConfiguration註解你的測試類,確保為你的測試載入了WebApplicationContext。 -
將模擬請求或會話注入到你的測試例項中,並根據需要準備你的測試夾具。
-
呼叫你從配置的
WebApplicationContext中檢索到的 Web 元件(透過依賴注入)。 -
對模擬執行斷言。
下面的程式碼片段展示了登入用例的 XML 配置。請注意,userService bean 依賴於一個請求作用域的 loginAction bean。此外,LoginAction 透過使用SpEL 表示式例項化,該表示式從當前 HTTP 請求中檢索使用者名稱和密碼。在我們的測試中,我們希望透過 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 表示式例項化的。
<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
}
}