Spring Boot 3.2 MockMvc测试出现Failed to write request错误
解决Spring Boot 3.2 MockMvc测试500错误(Failed to write request)
可能的原因及修复方案
1. 检查BillRecord类的序列化兼容性
Spring Boot默认使用Jackson序列化JSON,若BillRecord不满足Jackson序列化要求,会导致响应写入失败:
- 确保类存在无参构造函数(Jackson序列化的默认要求)
- 确保所有需要序列化的字段配有对应的
getter方法 - 若使用
LocalDate,确认Spring Boot的Jackson自动配置生效(Spring Boot 3.x默认集成jackson-datatype-jsr310模块,若手动排除需重新添加依赖)
示例修正后的BillRecord:
public class BillRecord { private Long id; private String code; private LocalDate billDate; // 无参构造函数 public BillRecord() {} // 带参构造函数 public BillRecord(Long id, String code, LocalDate billDate) { this.id = id; this.code = code; this.billDate = billDate; } // Getter方法 public Long getId() { return id; } public String getCode() { return code; } public LocalDate getBillDate() { return billDate; } }
2. 修正Mock匹配的参数类型
测试中Mock的是PageRequest.class,但Controller通过BindingPageRequestHelper.binding返回的可能是其他Pageable实现类(如自定义分页实现),导致Mock不匹配,实际调用了未Mock的真实方法引发异常。将Mock参数改为通用的Pageable.class:
Mockito.when(bill.getBill(Mockito.anyLong(), Mockito.any(Pageable.class))) .thenReturn(new PageImpl<>(Arrays.asList(alr)));
3. 排查BindingPageRequestHelper逻辑
确认BindingPageRequestHelper.binding方法未抛出异常,比如排序字段不存在、分页参数非法等。可在测试中打印newPageRequest内容,验证是否生成了有效的Pageable对象。
4. 启用详细日志定位具体异常
在测试环境配置中开启DEBUG日志,查看完整异常栈,明确"Failed to write request"(实际应为响应写入失败)的根本原因:
# application-test.properties logging.level.org.springframework.web=DEBUG logging.level.com.fasterxml.jackson=DEBUG
日志会暴露Jackson序列化时的字段访问异常、类型转换错误等细节。
5. 验证MockMvc配置正确性
确保测试类正确配置MockMvc,使用@WebMvcTest注解并正确MockBillService:
@WebMvcTest(BillController.class) class BillControllerTest { @Autowired private MockMvc mockMvc; @MockBean private BillService billService; // 测试方法... }
内容的提问来源于stack exchange,提问作者robert trudel
相关产品推荐
相关产品推荐

