对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-doc.cadn.net.cn

测试请求和会话作用域的Bean

Spring 从早期版本开始就支持请求和会话作用域的bean,你可以通过以下步骤测试你的请求作用域和会话作用域的bean:spring-doc.cadn.net.cn

以下代码片段展示了登录用例的XML配置。请注意,userService bean依赖于一个请求范围的loginAction bean。此外,LoginAction 是通过使用SpEL表达式实例化的,这些表达式从当前HTTP请求中检索用户名和密码。在我们的测试中,我们希望使用TestContext框架管理的mock来配置这些请求参数。spring-doc.cadn.net.cn

请求范围的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。然后我们可以根据已知的用户名和密码输入对结果进行断言。spring-doc.cadn.net.cn

@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框架管理的模拟会话中配置一个主题。下面的例子展示了如何做到这一点:spring-doc.cadn.net.cn

会话作用域的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,并且我们可以根据配置的主题对结果进行断言。spring-doc.cadn.net.cn

@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
	}
}