2

如果我有一个实现 Writable 的自定义对象类,那么使用 mockito 进行单元测试来测试序列化/反序列化是否正常工作的最佳方法是什么?我正在考虑创建模拟映射器/缩减器,但这似乎太没必要了。

示例代码:

public class CustomObj implements Writable {
    private String value;

    public CustomObj(String v) {
        value = v;
    }

    @Override
    public void write(DataOutput out) throws IOException {
        out.writeChars(value);
    }

    public void readFields(DataInput in) throws IOException {
        value = in.readLine();
    }
4

1 回答 1

3

为什么要为此使用模拟框架?

往返测试将是最简单和最快的 - 所以只需序列化然后反序列化并比较两个实例。不要使用你的 equals() 方法进行比较,即使它已经过很好的测试。

您还需要测试边缘,例如,为了确保在反序列化时重新创建/重新添加瞬态字段,您可以使用readResolve()

可以在IBM DeveloperWorks上找到一些有用的提示

这是一个示例往返测试:

public class WritableTest {


    public class CustomObj implements Writable {
        private String value;

        public CustomObj(String v) {
            value = v;
        }

        @Override
        public void write(DataOutput out) throws IOException {
            out.writeUTF(value);
        }

        @Override
        public void readFields(DataInput in) throws IOException {
            value = in.readUTF();
        }
    }


    @Test
    public void roundTripSerialization() throws Exception
    {
        ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
        DataOutput out = new DataOutputStream(byteOutput);

        CustomObj original = new CustomObj("originalValue");

        original.write(out);


        CustomObj deserialized = new CustomObj("you should really use add a zero arg constructor as well");

        DataInput in = new DataInputStream(new ByteArrayInputStream(byteOutput.toByteArray()));

        deserialized.readFields(in);


        Assert.assertEquals(original.value, deserialized.value);
    }
}
于 2013-04-25T21:33:46.190 回答