如何在@WebFluxTest中访问并修改WebSession用于控制器测试?
在@WebFluxTest中访问并修改WebSession的方法
当然可以!在Spring WebFlux的测试场景下,你可以通过MockWebSession直接创建并配置会话属性,再结合WebTestClient将其绑定到测试请求中,完美解决你的需求。
下面是具体的实现方案,附完整测试代码:
方法一:直接创建MockWebSession并设置属性
这是最直接的方式,适合你的场景——不需要依赖其他接口来初始化会话,直接手动构造需要的会话状态。
@WebFluxTest(ApiController.class) class ApiControllerTest { @Autowired private WebTestClient webTestClient; @Test void getThings_WhenSessionStateIsStarted_Succeeds() { // 1. 创建模拟会话并设置state属性 MockWebSession mockSession = new MockWebSession(); mockSession.getAttributes().put("state", "started"); // 2. 携带这个模拟会话发起请求 webTestClient.get() .uri("/somethings") .session(mockSession) // 将模拟会话绑定到请求 .exchange() .expectStatus().isOk(); // 根据你的API实际返回调整断言 } @Test void getThings_WhenSessionStateIsNotStarted_ThrowsError() { MockWebSession mockSession = new MockWebSession(); // 可以设置错误的state,或者不设置(此时getAttribute返回null) mockSession.getAttributes().put("state", "idle"); webTestClient.get() .uri("/somethings") .session(mockSession) .exchange() .expectStatus().is5xxServerError(); // 对应RuntimeException的响应状态 } }
关键说明:
MockWebSession是Spring提供的WebSession的模拟实现,完全兼容控制器中对WebSession的依赖。- 通过
getAttributes()可以直接操作会话中的属性,快速设置你需要的测试状态。 WebTestClient的.session()方法会将模拟会话关联到当前请求,控制器方法参数中的WebSession就会是你预先配置好的实例。
额外优化建议
你的控制器代码中有个潜在的空指针风险:如果webSession.getAttribute("state")返回null,调用equals()会直接抛出异常。建议调整成更安全的写法:
if (!"started".equals(webSession.getAttribute("state"))) { throw new RuntimeException("Cannot make API calls until session has started"); }
这样即使state属性不存在,也会正确触发异常逻辑,避免不必要的空指针问题。
内容的提问来源于stack exchange,提问作者mahanhz
相关产品推荐
相关产品推荐

