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

保存JSON字符串时单元测试失败的原因及代码修改方案

问题分析与解决方案

为什么查询实体时JSON被添加引号?

  • 你的Poi实体类中position字段大概率是String类型,而非专门的JSON对象类型(比如自定义Position类、Map或JSONNode)。保存时JSON字符串被当作普通字符串存入数据库,查询时自然会带着引号返回。
  • 另一种可能是实体类未正确配置JSON序列化注解(比如JPA的@Column(columnDefinition = "json")、Jackson相关注解),导致ORM框架将JSON对象按普通字符串处理,自动添加引号包裹。

如何修改测试代码(或彻底解决问题)

方案1:修复实体类(推荐,从根源解决)

如果position本应是JSON结构,调整实体类定义:

  1. 先定义对应JSON结构的实体类:
public class Position {
    private int x;
    private int y;
    private int z;
    // 添加入参构造器、getter、setter方法
}
  1. 修改Poi实体的position字段类型,并添加JSON序列化配置(以Spring Data JPA为例):
import jakarta.persistence.Column;

// 使用JSON类型字段存储
@Column(columnDefinition = "json")
private Position position;

配置后ORM框架会自动处理JSON的序列化与反序列化,查询返回的就是无引号的JSON结构,原第三个断言就能正常通过。

方案2:临时调整测试代码

若暂时无法修改实体类,可调整断言逻辑匹配实际返回值:

  • 直接使用已通过的断言逻辑,移除无效的第三个断言:
@Test
void save() {
    PoiDto saveDto = createPoi();

    Poi entity = poiRepository.findById(saveDto.id()).orElseThrow();

    assertEquals(saveDto.id(), entity.getId());
    assertEquals(saveDto.code(), entity.getCode());
    assertEquals("\"" + saveDto.position() + "\"", entity.getPosition());
}
  • 或者移除实体返回值的引号后再断言:
@Test
void save() {
    PoiDto saveDto = createPoi();

    Poi entity = poiRepository.findById(saveDto.id()).orElseThrow();

    assertEquals(saveDto.id(), entity.getId());
    assertEquals(saveDto.code(), entity.getCode());
    assertEquals(saveDto.position(), entity.getPosition().replace("\"", ""));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:35:22