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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:52:16