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

Spring WebFlux控制器测试:Mock服务返回POJO未序列化为JSON响应

问题解决:WebMvcTest测试Reactive控制器时Mock响应返回POJO而非JSON

问题分析

你在测试返回Mono<OtcBalanceResponse>的控制器时,MockMvc直接返回了原始POJO对象而非序列化后的JSON,导致jsonPath断言失败。这是因为Reactive类型的响应属于异步处理,默认情况下MockMvc不会自动完成异步响应的序列化流程,直接暴露了异步结果的Java对象。

另外你的测试代码中存在变量覆盖问题:setupMocks方法里重新定义了局部变量otcResponseMock,导致类成员变量未被正确初始化(虽然当前不影响responseMono的创建,但会造成代码混淆)。

解决方案

1. 修正变量覆盖问题

在setupMocks中,将局部变量定义改为对成员变量的赋值:

@BeforeEach
void setupMocks() {
    // 去掉前面的类型声明,直接赋值给成员变量
    otcResponseMock = new OtcBalanceResponse();
    otcResponseMock.setOtcBalance(new BigDecimal("1.30"));
    otcResponseMock.setUserId("testID");
    responseMono = Mono.just(otcResponseMock);
}

2. 正确处理异步响应

对于返回Reactive类型(Mono/Flux)的控制器,需要手动触发异步响应的分发,让Spring完成消息转换器的序列化流程,这样jsonPath才能解析JSON结构:

@Test
void testGetCustomerOTCBalance() throws Exception {
    when(customerService.getCustomerOTCBalance(any(OtcBalanceRequest.class)))
            .thenReturn(responseMono);

    MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/customer/otc-balance")
            .accept(MediaType.APPLICATION_JSON);

    // 1. 执行请求,确认异步启动并获取MvcResult
    MvcResult mvcResult = mvc.perform(requestBuilder)
            .andExpect(request().asyncStarted())
            .andReturn();

    // 2. 分发异步请求,获取序列化后的JSON响应并断言
    mvc.perform(asyncDispatch(mvcResult))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.otcBalance").value(1.30));
}

3. 确保POJO可被Jackson序列化

检查OtcBalanceResponse类是否存在对应属性的getter方法(比如getOtcBalance()),Jackson序列化和jsonPath断言都依赖这些方法来访问属性。如果没有getter,可以:

  • 添加标准的getter方法
  • 或者在类上添加@Data(Lombok注解)自动生成getter/setter

验证要点

  • 执行测试前确认项目已引入spring-boot-starter-webflux或Jackson相关依赖(Spring Boot默认会包含)
  • 可以在分发异步请求后添加andDo(print()),查看完整的响应内容,确认JSON序列化是否正常:
mvc.perform(asyncDispatch(mvcResult))
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.otcBalance").value(1.30));

内容的提问来源于stack exchange,提问作者Addison Joseph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:15:39