是因为Jackson在比较对象时会直接比较它们的引用而不是内容。因此,即使两个对象的内容相同,但是它们是通过不同方式创建的,它们的引用地址也是不同的,所以assertEquals会认为它们不相等。
为了解决这个问题,可以使用Jackson的ObjectMapper类来序列化和反序列化对象。通过将对象序列化为字符串,然后再反序列化为新的对象,可以确保使用相同方式创建的对象是等效的。
下面是解决这个问题的示例代码:
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进行比较。
注意:在实际开发中,为了提高性能,可以使用缓存来存储已经序列化的对象,避免重复序列化。
领取专属 10元无门槛券
手把手带您无忧上云