此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

测试请求范围和会话范围的 Bean

Spring 从早年开始就支持 Request 和 session-scoped bean,你可以测试你的 request-scoped 和 session-scoped Beans 执行以下步骤:spring-doc.cadn.net.cn

下一个代码片段显示了登录使用案例的 XML 配置。请注意,userServicebean 依赖于请求范围的loginAction豆。此外,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(即 test) 和MockHttpServletRequest添加到我们的测试实例中。在我们的requestScope()test 方法中,我们通过在 提供的MockHttpServletRequest.当loginUser()方法在我们的userService,我们可以确保用户服务可以访问请求范围的loginAction对于当前的MockHttpServletRequest(也就是说,我们只是 set 参数)。然后,我们可以根据已知的 username 和 password 的输入。下面的清单显示了如何做到这一点: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
	}
}

下面的代码片段类似于我们之前看到的 request-scoped 豆。然而,这一次,userServicebean 依赖于会话范围的userPreferences豆。请注意,UserPreferencesbean 通过使用 从当前 HTTP 会话中检索主题的 SPEL 表达式。在我们的测试中,我们 需要在 TestContext 框架管理的 mock session 中配置一个主题。这 以下示例显示了如何执行此作: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()test 方法中,我们通过以下方式设置测试夹具 设置预期theme属性MockHttpSession.当processUserPreferences()方法在我们的userService,我们确信 用户服务可以访问会话范围的userPreferences对于当前的MockHttpSession,我们可以根据 配置的主题。以下示例显示了如何执行此作: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
	}
}