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

Spring自从早期就支持请求和会话作用域的Bean,您可以通过以下步骤测试您的请求作用域和会话作用域的Bean:

  • 通过在测试类上注释@WebAppConfiguration,确保为您的测试加载了WebApplicationContext

  • 将模拟请求或会话注入到您的测试实例中,并根据需要准备测试夹具。

  • 调用您从配置的WebApplicationContext(通过依赖注入)中检索到的Web组件。

  • 对模拟对象执行断言。

下面的代码片段显示了登录用例的XML配置。请注意,userService Bean依赖于一个请求作用域的loginAction Bean。此外,LoginAction是通过使用SpEL表达式从当前HTTP请求中检索用户名和密码实例化的。在我们的测试中,我们希望通过TestContext框架管理的模拟对象配置这些请求参数。以下清单显示了此用例的配置:

请求作用域的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测试

  • 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框架管理的模拟会话中配置一个主题。以下示例显示了如何执行:

会话作用域的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测试

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