保存JSON字符串时单元测试失败的原因及代码修改方案
问题分析与解决方案
为什么查询实体时JSON被添加引号?
- 你的
Poi实体类中position字段大概率是String类型,而非专门的JSON对象类型(比如自定义Position类、Map或JSONNode)。保存时JSON字符串被当作普通字符串存入数据库,查询时自然会带着引号返回。 - 另一种可能是实体类未正确配置JSON序列化注解(比如JPA的
@Column(columnDefinition = "json")、Jackson相关注解),导致ORM框架将JSON对象按普通字符串处理,自动添加引号包裹。
如何修改测试代码(或彻底解决问题)
方案1:修复实体类(推荐,从根源解决)
如果position本应是JSON结构,调整实体类定义:
- 先定义对应JSON结构的实体类:
public class Position { private int x; private int y; private int z; // 添加入参构造器、getter、setter方法 }
- 修改
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
相关产品推荐
相关产品推荐

