测试请求和会话作用域的 Bean
Infra 自早期以来一直支持 请求和会话作用域的 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(即被测对象)和 HttpMockRequestImpl 注入到我们的测试实例中。
在我们的 requestScope() 测试方法中,我们通过在提供的 HttpMockRequestImpl 中设置请求参数来设置我们的测试夹具。
当在我们的 userService 上调用 loginUser() 方法时,我们可以确信用户服务可以访问当前 HttpMockRequestImpl(即我们刚刚设置参数的那个)的请求作用域 loginAction。
然后,我们可以根据已知的用户名和密码输入对结果执行断言。
以下清单显示了如何执行此操作:
-
请求作用域 Bean 测试
@JUnitWebConfig
class RequestScopedBeanTests {
@Autowired UserService userService;
@Autowired MockHttpServletRequest request;
@Test
void requestScope() {
request.setParameter("user", "enigma");
request.setParameter("pswd", "$pr!ng");
LoginResults results = userService.loginUser();
// 断言结果
}
}
以下代码片段与我们之前看到的请求作用域 Bean 的代码片段类似。
但是,这一次,userService Bean 依赖于会话作用域的 userPreferences Bean。
请注意,UserPreferences Bean 是使用从当前 HTTP 会话中检索主题的 SpEL 表达式实例化的。
在我们的测试中,我们需要在 TestContext 框架管理的模拟会话中配置主题。
以下示例显示了如何执行此操作:
<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,并且我们可以根据配置的主题对结果执行断言。
以下示例显示了如何执行此操作:
-
会话作用域 Bean 测试
@JUnitWebConfig
class SessionScopedBeanTests {
@Autowired UserService userService;
@Autowired MockHttpSession session;
@Test
void sessionScope() throws Exception {
session.setAttribute("theme", "blue");
Results results = userService.processUserPreferences();
// 断言结果
}
}