用户定义对象序列化的 Junit 测试失败

Junit test failed for user-defined object Serialization

在运行一个用户定义对象序列化的Junit测试之后,它失败了并给了我结果

预计:com.me.Position@7a92922

实际:com.me.Position@25618e91

我定义了以下内容class

public class Position {

    private double x;
    private double y;

    /**
     * default constructor
     */
    public Position() {
    }

    /**
     * paramterized constructor
     * 
     * @param x
     *          x-coordinate
     * @param y
     *          y-coordinate
     */
    public Position(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }
}

然后我定义了另一个 class 来序列化和反序列化一个 Position 对象,它是前一个 class 的实例,如下

public class PositionSerializer {

    static void serialize(Position position, OutputStream outputStream) {
        OutputStreamUtil.serializeDouble(position.getX(), outputStream);
        OutputStreamUtil.serializeDouble(position.getY(), outputStream);
    }

    static Position deserialize(InputStream inputStream) {
        double x = InputStreamUtil.deserializeDouble(inputStream);
        double y = InputStreamUtil.deserializeDouble(inputStream);
        Position positionObject = new Position();
        positionObject.setX(x);
        positionObject.setY(y);
        return positionObject;
    }
}

最后写了一个单元测试如下

public class PositionSerializerTest {

    private InputStream iStream;
    private ByteArrayOutputStream oStream;

    @Before
    public void init() {
        oStream = new ByteArrayOutputStream();
    }

    Position serialzeAndDeserializeObject(Position positionObject) {
        PositionSerializer.serialize(positionObject, oStream);
        iStream = new ByteArrayInputStream(oStream.toByteArray());
        return PositionSerializer.deserialize(iStream);
    }

    @Test
    public void equals_equal() {
        Position positionObject = new Position(5.5, 10.5);
        Position deserializedPosition = serialzeAndDeserializeObject(positionObject);
        assertThat(deserializedPosition).isEqualTo(positionObject);
    }
}

怎么了?以及如何解决?

没有问题,但是你在反序列化方法中创建了一个新实例:

Position positionObject = new Position();

这将始终调用位置对象的新实例,因此您无法使用 == 运算符对其进行比较

您应该重写 equals 方法,如下所示:

public boolean equals(Object o) {
    if (o == this) {
        return true;
    }
    if (!(o instanceof Position)) {
        return false;
    }
    Position otherObject = (Position)o;
    if(this.x == otherObject.x && this.y == otherObject.y)
        return true;
    else return false;
}

然后调用:

assertThat(deserializedPosition).isEqualTo(positionObject);

您正在检查不相等的引用相等性,因为您的反序列化方法 returns 每次调用都会有新实例,请使用下面的值进行比较:

assertThat(deserializedPosition.getX()).isEqualTo(positionObject.getX())    
assertThat(deserializedPosition.getY()).isEqualTo(positionObject.getY())

您的测试似乎是在比较对象引用而不是对象值。覆盖 equals 函数或分别比较位置对象中的每个值。