首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

对于以不同方式创建的等效Jackson对象,assertEquals将失败

是因为Jackson在比较对象时会直接比较它们的引用而不是内容。因此,即使两个对象的内容相同,但是它们是通过不同方式创建的,它们的引用地址也是不同的,所以assertEquals会认为它们不相等。

为了解决这个问题,可以使用Jackson的ObjectMapper类来序列化和反序列化对象。通过将对象序列化为字符串,然后再反序列化为新的对象,可以确保使用相同方式创建的对象是等效的。

下面是解决这个问题的示例代码:

代码语言:txt
复制
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Assert;

public class JacksonEqualsTest {

    public static void main(String[] args) throws Exception {
        // 创建两个等效的Jackson对象
        MyObject obj1 = createObject();
        MyObject obj2 = createObject();

        // 使用ObjectMapper进行序列化和反序列化
        ObjectMapper objectMapper = new ObjectMapper();
        String json1 = objectMapper.writeValueAsString(obj1);
        MyObject newObj1 = objectMapper.readValue(json1, MyObject.class);
        String json2 = objectMapper.writeValueAsString(obj2);
        MyObject newObj2 = objectMapper.readValue(json2, MyObject.class);

        // 使用assertEquals比较新创建的对象
        Assert.assertEquals(newObj1, newObj2);
    }

    private static MyObject createObject() {
        MyObject obj = new MyObject();
        obj.setId(1);
        obj.setName("Jackson Object");
        return obj;
    }

    // 定义一个简单的POJO类
    private static class MyObject {
        private int id;
        private String name;

        // 省略getter和setter方法

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            MyObject myObject = (MyObject) o;
            return id == myObject.id && name.equals(myObject.name);
        }

        @Override
        public int hashCode() {
            return Objects.hash(id, name);
        }
    }
}

在这个例子中,我们使用ObjectMapper将对象序列化为JSON字符串,然后再通过ObjectMapper将JSON字符串反序列化为新的对象。通过这种方式,我们确保了使用相同方式创建的对象是等效的,可以通过assertEquals进行比较。

注意:在实际开发中,为了提高性能,可以使用缓存来存储已经序列化的对象,避免重复序列化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Jackson 解析 JSON 详细教程

JSON 对于开发者并不陌生,如今 WEB 服务、移动应用、甚至物联网大多都是以 JSON 作为数据交换格式。学习 JSON 格式操作工具对开发者来说是必不可少。...这个类中有一些常用方法: • readValue() 方法可以进行 JSON 反序列化操作,比如可以字符串、文件流、字节流、字节数组等常见内容转换成 Java 对象。...• writeValue() 方法可以进行 JSON 序列化操作,可以 Java 对象转换成 JSON 字符串。...Jackson JSON 基本操作 Jackson 作为一个 Java 中 JSON 工具库,处理 JSON 字符串和 Java 对象是它最基本最常用功能,下面通过一些例子来演示其中用法。...这两者在 Jackson处理略有不同。 先创建一个有两种时间类型属性 Order 类。

3K10
  • SpringBoot学习笔记(二)——SpringBoot测试JUnit5、 SpringBoot 配置、Spring IoC与自动装配

    Mockito:mock框架,可以按类型创建mock对象,可以根据方法参数指定特定响应,也支持对于mock调用过程断言。 JSONassert:为JSON提供了断言功能。...当应用了IoC,一个对象依赖其它对象会通过被动方式传递进来,而不是这个对象自己创建或者查找依赖对象。...没有IoC程序中我们使用面向对象编程对象创建对象依赖关系完全硬编码在程序中,对象创建由程序自己控制,控制反转后将对象创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象方式反转了。...prototype---原型  想创建多少个就创建多少了。 request---针对Web项目,不同请求创建单独Bean对象,同一个请求共享一个Bean。...session---针对Web项目,不同会话创建单独Bean对象,同一个会话共享一个Bean。

    3.9K10

    Java8 中真的 Optional 很强大,你用对了吗?

    为了简化这个过程,我们来看看用 Optional 类是怎么做。从创建和验证实例,到使用其不同方法,并与其它返回相同类型方法相结合,下面是见证 Optional 奇迹时刻。...---- 创建 Optional 实例 重申一下,这个类型对象可能包含值,也可能为空。你可以使用同名方法创建一个空 Optional。...不过,orElse() 方法仍然创建了 User 对象。与之相反,orElseGet() 方法不创建 User 对象。...(email, user.getEmail()); } map() 对值应用(调用)作为参数函数,然后返回值包装在 Optional 中。...如果你需要序列化对象包含 Optional 值,Jackson 库支持把 Optional 当作普通对象。也就是说,Jackson 会把空对象看作 null,而有值对象则把其值看作对应域值。

    79220

    Java8 中真的 Optional 很强大,你用对了吗?

    为了简化这个过程,我们来看看用 Optional 类是怎么做。从创建和验证实例,到使用其不同方法,并与其它返回相同类型方法相结合,下面是见证 Optional 奇迹时刻。...---- 创建 Optional 实例 重申一下,这个类型对象可能包含值,也可能为空。你可以使用同名方法创建一个空 Optional。...不过,orElse() 方法仍然创建了 User 对象。与之相反,orElseGet() 方法不创建 User 对象。...(email, user.getEmail()); } map() 对值应用(调用)作为参数函数,然后返回值包装在 Optional 中。...如果你需要序列化对象包含 Optional 值,Jackson 库支持把 Optional 当作普通对象。也就是说,Jackson 会把空对象看作 null,而有值对象则把其值看作对应域值。

    94830

    上篇|Jackson注解用法和场景,不看巨亏

    @JacksonAnnotation 这个注解经常用于Jackson自定义注解中,用来标记这是一个Jackson注解,这个胖哥在Jackson脱敏一文中用过它来实现自定义序列化注解。...@JsonAnyGetter 在json序列化时可以Bean中java.util.Map类型属性“平铺展开”,举个例子: 某个Java Bean正常json序列化结果是: { "name":...@JsonAutoDetect 一般情况下,我们认为Jackson序列化对象前提是有无参构造并且有Getter方法。...@JsonFilter 同一个实体类根据不同场景可能需要不同序列化策略。比如对于A用户实体某些字段可见,对于B用户另一些字段可见,实现动态数据字段权限。...小结 Jackson是一款非常优秀json类库,提供了丰富注解来满足各种场景需要。本篇介绍了一部分注解用法和场景。

    1.9K30

    Mockito模拟进行单元测试

    1.3 Stub和Mock异同 相同:Stub和Mock都是模拟外部依赖 不同:Stub是完全模拟一个外部依赖, 而Mock还可以用来判断测试通过还是失败  1.4 Mockito资源 官网: http...(1, comparable.compareTo("Test")); assertEquals(2, comparable.compareTo("Omg")); //对于没有预设情况会返回默认值...,因为例子传入List为三个元素,所以此时失败。...)); }  用spy监控真实对象   Mock不是真实对象,它只是用类型class创建了一个虚拟对象,并可以设置对象行为 Spy是一个真实对象,但它可以设置对象行为 InjectMocks创建这个类对象并自动标记...,因为add(2)没有被验证,所以下面的代码会失败抛出异常 verifyNoMoreInteractions(list2); } Mockito并不是创建一个真实对象,而是模拟这个对象,他用简单

    9.3K20

    Mockito模拟进行单元测试

    (1, comparable.compareTo("Test")); assertEquals(2, comparable.compareTo("Omg")); //对于没有预设情况会返回默认值...,因为例子传入List为三个元素,所以此时失败。...)); } 用spy监控真实对象 Mock不是真实对象,它只是用类型class创建了一个虚拟对象,并可以设置对象行为 Spy是一个真实对象,但它可以设置对象行为 InjectMocks创建这个类对象并自动标记...,因为add(2)没有被验证,所以下面的代码会失败抛出异常 verifyNoMoreInteractions(list2); } Mockito并不是创建一个真实对象,而是模拟这个对象,他用简单..."first" Mockito.when(mockedList.get(0)).thenReturn("first"); 在Mock对象时候,创建一个proxy对象,保存被调用方法名(get),以及调用时候传递参数

    6.9K20

    除了FastJson,你还有选择: Gson简易指南

    Gson 对象创建主要有两种方式: 使用 new 关键字直接创建:Gson gson = new Gson() 由 GsonBuilder 对象构建:Gson gson = new GsonBuilder...().create() 通常情况下,上面两种方式创建 Gson 对象在进行序列化与反序列操作时行为都是一样,但是第二种方式构建 Gson 对象时,允许进行额外行为定制,比如格式化 JSON 字符串输出内容...Java 序列化 简单对象序列化 我们可以通过下面的例子来看下通过上述两种方式序列化 Java 对象不同效果: public class ResultTest { @Test void..., Class classOfT),尝试 JSON 字符串转为指定 Class 对象,如果转换失败,就会抛出 JsonSyntaxException 异常。...从上述描述中我们可以知道执行 fromJson 之后,反序列化后得到 List 元素类型为 LinkedTreeMap,而不是 Person,所以 Person 对象方式访问 id 属性时就会抛出

    1.3K30

    除了FastJson,你还有选择: Gson简易指南

    [006y8mN6gy1g6s4ign9myj30w20swgs2.jpg] Gson 对象创建主要有两种方式: 使用 new 关键字直接创建:Gson gson = new Gson() 由 GsonBuilder...对象构建:Gson gson = new GsonBuilder().create() 通常情况下,上面两种方式创建 Gson 对象在进行序列化与反序列操作时行为都是一样,但是第二种方式构建 Gson...Java 序列化 简单对象序列化 我们可以通过下面的例子来看下通过上述两种方式序列化 Java 对象不同效果: public class ResultTest { @Test void..., Class classOfT),尝试 JSON 字符串转为指定 Class 对象,如果转换失败,就会抛出 JsonSyntaxException 异常。...从上述描述中我们可以知道执行 fromJson 之后,反序列化后得到 List 元素类型为 LinkedTreeMap,而不是 Person,所以 Person 对象方式访问 id 属性时就会抛出

    1.6K40

    【Java 基础篇】Java JUnit 使用详解

    该方法使用assertEquals断言来检查math.add(2, 3)结果是否等于5。如果不等于5,测试失败。...根据您测试需求,可以选择适当注解来优化测试代码。 测试套件 测试套件是一种多个测试类组合在一起运行方式。...这对于测试具有多个输入组合方法非常有用。 要创建参数化测试,您可以使用@ParameterizedTest注解,然后提供测试参数和测试工厂方法。...确保您测试方法是独立,不依赖于执行顺序。 测试套件:JUnit允许您创建测试套件,一组相关测试类组合在一起运行。这对于执行整个测试集合非常有用。...@Disabled @Test void testDisabled() { // 这个测试方法被禁用 } 使用Mock对象:当测试依赖于外部资源或其他类时,考虑使用Mock对象来模拟这些依赖,隔离测试并使其更可靠

    1.3K20

    Mock 与 Stub

    而我们通常关注是被测试对象功能和行为,对于依赖,我们仅仅需要关注它们之间交互,但对依赖对象是如何执行具体细节我们并不关注。...不同点 Mock和Stub有两个主要区别: 校验测试结果方式不同,Mock倾向于校验行为(Beahavior verification),Stub倾向于校验状态; Mock和Stub也代表了两种测试与设计结合在一起理念...上面的说法比较抽象,让我们通过例子来看看Mock与Stub区别。 使用Stub进行单元测试 下面是一个使用Stub进行单元测试例子,我们打算创建一个订单对象,并用仓库中货物填充这个订单。...这个订单对象很简单,只有产品和数量两种信息,仓库保存着不同产品目录。...但真正WareHouse对象内部可能有很复杂实现,比如读取文件,访问数据库,持有同步锁维持对象在并发访问时内部数据正确等。

    1.5K20

    Java进阶|Springboot切换fastjson序列化实战

    什么是FastjsonFastjson是一个Java库,可用于Java对象转换为其JSON表示,它也可用于JSON字符串转换为等效Java对象。...Fastjson采用独创算法,JSON Parse速度提升到极致,超过所有其他JSON库,包括曾经号称最快Jackson。...系统:Macbook Pro 13.2IDEA:IntelliJ IDEA 2022.3.2 (Ultimate Edition)JDK:1.8+(1)创建SpringBoot项目我们为了演示效果,可以使用最快捷方式创建一个...当然下面两个方式都是可以使用IDEA创建一个项目。由于IDEA版本差异,有些操作可能不同,请按照自己IDEA版本进行操作。【创建一个空项目】如果熟悉创建项目操作,我们也可以创建一个空项目。...注意版本兼容性:Fastjson版本不同,可能导致API和使用方式有所不同。因此,在升级Fastjson版本时,需要仔细阅读官方文档并测试代码确保兼容性。

    1.1K10

    为什么你一直在写假测试用例?

    我们主要目标是介绍如何测试API可用性——示例将使用最新版本 GitHub REST API。 对于内部应用程序,此类测试通常在部署REST API之后,作为持续集成后期步骤运行。...不管出于什么原因它失败了,那么在被修复之前,我们就不需要查看这个API相关测试用例。 3....正如您可能已经注意到,我们在按照一个循序渐进方式进行测试 ——首先是响应状态码(确保接口是可用),然后是服务器响应媒体类型,并且只有到下一个测试用例,我们才会检查接口返回JSON数据。...测试利器 我们将使用Jackson 2JSON字符串反序列化成一个类型安全Java实体: public class GitHubUser { private String login;...总结 上面的示例只是完整集成测试一部分。测试着重于确保REST API正确性,而不必涉及更复杂情况,譬如,以下内容都没有涉及:API可发现性、对同一资源使用不同表述等等。

    24820

    敏捷测试价值观、方法和实践读书笔记(5)

    如果成功,则重构代码;如果失败,则更新或修复测试代码 除非有一个测试失败,否则不要写任何代码 定期重构,避免重复,保持代码设计一致性和定义唯一性。...“三段论” 创建一个模拟对象或监视 (Spy) 一个已创建对象 在执行真实方法前绑定方法运行结果。 验证结果或方法是否被执行。 Mock 对象不能替代集成测试 创建账户时候生成一个 ID。...把数据库操作对象“注入”进去,最好是使用构造函数方式 @Test public void verifyCreateAccountWillSaveToRepository () { Account...以便我能够继续在我储蓄账户上存取款 首先,我们列举出不同场景。...使用 any()让模拟对象方法返回指定类型任意对象。因为accoutRepository目前只是一个接口,没有任何实现,所以无法返回对象。不过,我们可以使用when()方创建一个对象

    3510
    领券