WebTestClient断言失败:响应对象与预期不符求助
问题原因
报错显示两个Response对象的引用地址不同,核心原因是:WebTestClient在接收响应时,会将Controller返回的对象序列化为JSON,再反序列化为一个全新的Response实例。而你的Response类没有重写equals()和hashCode()方法,默认的Object.equals仅比较对象引用,所以即使字段值完全一致,两个不同实例的断言也会失败。
解决思路
1. 重写Response类的equals和hashCode方法
这是最根本的解决方案,让对象的相等性判断基于字段值而非引用地址。
方式1:用Lombok简化实现
给Response类添加@Data注解,Lombok会自动生成符合规范的equals、hashCode、getter/setter等方法:
import lombok.Data; import java.io.Serializable; import java.time.LocalDateTime; @Data public class Response implements Serializable { private static final long serialVersionUID = 1L; private String id; private Long amount; private LocalDateTime dateTime; private String status; }
方式2:手动重写方法
如果不想依赖Lombok,可以手动实现:
import java.io.Serializable; import java.time.LocalDateTime; import java.util.Objects; public class Response implements Serializable { private static final long serialVersionUID = 1L; private String id; private Long amount; private LocalDateTime dateTime; private String status; // 省略getter/setter @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Response response = (Response) o; return Objects.equals(id, response.id) && Objects.equals(amount, response.amount) && Objects.equals(dateTime, response.dateTime) && Objects.equals(status, response.status); } @Override public int hashCode() { return Objects.hash(id, amount, dateTime, status); } }
2. 验证LocalDateTime的序列化一致性
注意Response类包含LocalDateTime字段,需确保Spring WebFlux的Jackson配置能正确处理该类型,避免因序列化/反序列化逻辑不一致导致字段值不匹配。
确保项目引入Jackson的JSR310模块(Spring Boot会自动注册该模块):
<!-- Maven依赖 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
3. 替代方案:直接断言JSON内容(无需修改实体类)
如果暂时不想修改Response类,可以跳过对象实例比较,直接断言响应的JSON内容与预期对象的JSON一致:
@Test void shouldReturnResponse() throws JsonProcessingException { var response = new Response(); response.setId("id"); response.setAmount(10L); // 初始化ObjectMapper并注册JavaTime模块处理LocalDateTime ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); String expectedJson = objectMapper.writeValueAsString(response); when(myService.getResponse()).thenReturn(Mono.just(response)); webTestClient.post() .uri("/") .exchange() .expectStatus().isOk() .expectBody() .json(expectedJson); }
内容的提问来源于stack exchange,提问作者crimson589
相关产品推荐
相关产品推荐

