【问题标题】:Junit test failed for user-defined object Serialization用户定义对象序列化的 Junit 测试失败
【发布时间】:2018-07-31 16:35:44
【问题描述】:

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

预期:com.me.Position@7a92922

实际:com.me.Position@25618e91

我已经定义了以下类

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;
    }
}

然后我定义了另一个类来序列化和反序列化一个 Position 对象,该对象是上一个类的实例,如下所示

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);
    }
}

出了什么问题?以及如何解决?

【问题讨论】:

标签: java junit inputstream outputstream


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多