測試請求和會話作用域的 Bean

Spring 從早期就支援請求和會話作用域的 Bean,你可以按照以下步驟測試你的請求和會話作用域的 Bean

  • 透過使用 @WebAppConfiguration 註解你的測試類,確保為你的測試載入了 WebApplicationContext

  • 將 mock 請求或會話注入到你的測試例項中,並根據需要準備你的測試夾具。

  • 呼叫你從配置的 WebApplicationContext 中獲取的 Web 元件(透過依賴注入)。

  • 對 mock 進行斷言。

下一個程式碼片段展示了一個登入用例的 XML 配置。請注意,userService bean 依賴於一個請求作用域的 loginAction bean。此外,LoginAction 是使用SpEL 表示式例項化的,這些表示式從當前的 HTTP 請求中檢索使用者名稱和密碼。在我們的測試中,我們希望透過 TestContext 框架管理的 mock 來配置這些請求引數。以下清單顯示了此用例的配置

請求作用域 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 測試
  • 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 是使用一個 SpEL 表示式例項化的,該表示式從當前 HTTP 會話中檢索主題。在我們的測試中,我們需要在 TestContext 框架管理的 mock 會話中配置一個主題。以下示例展示瞭如何做到這一點

會話作用域 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 中,我們將 UserServiceMockHttpSession 都注入到我們的測試例項中。在 sessionScope() 測試方法中,我們透過在提供的 MockHttpSession 中設定預期的 theme 屬性來設定測試夾具。當在 userService 上呼叫 processUserPreferences() 方法時,我們確保使用者服務可以訪問當前 MockHttpSession 的會話作用域 userPreferences,並且我們可以根據配置的主題對結果進行斷言。以下示例展示瞭如何做到這一點

會話作用域 Bean 測試
  • 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
	}
}