You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:52:18