跳到主要内容

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

ChatGPT-4o 中英对照 Testing Request- and Session-scoped Beans

Spring 自早期以来就支持请求和会话范围的 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>
xml

RequestScopedBeanTests 中,我们将 UserService(即测试的对象)和 MockHttpServletRequest 注入到我们的测试实例中。在我们的 requestScope() 测试方法中,我们通过在提供的 MockHttpServletRequest 中设置请求参数来设置我们的测试装置。当在我们的 userService 上调用 loginUser() 方法时,我们可以确信用户服务可以访问当前 MockHttpServletRequest 的请求范围的 loginAction(即我们刚刚设置参数的那个)。然后,我们可以根据已知的用户名和密码输入对结果进行断言。以下列表展示了如何做到这一点:

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

以下代码片段与我们之前看到的请求范围 bean 类似。不过,这次 userService bean 依赖于会话范围的 userPreferences bean。注意,UserPreferences bean 是通过使用一个 SpEL 表达式来实例化的,该表达式从当前 HTTP 会话中检索主题。在我们的测试中,我们需要在由 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>
xml

SessionScopedBeanTests 中,我们将 UserServiceMockHttpSession 注入到我们的测试实例中。在 sessionScope() 测试方法中,我们通过在提供的 MockHttpSession 中设置预期的 theme 属性来设置我们的测试夹具。当在我们的 userService 上调用 processUserPreferences() 方法时,我们可以确信用户服务可以访问当前 MockHttpSession 的会话范围 userPreferences,并且我们可以根据配置的主题对结果进行断言。以下示例展示了如何做到这一点:

@SpringJUnitWebConfig
class SessionScopedBeanTests {

@Autowired UserService userService;
@Autowired MockHttpSession session;

@Test
void sessionScope() throws Exception {
session.setAttribute("theme", "blue");

Results results = userService.processUserPreferences();
// assert results
}
}
java