Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用mockito对自定义可写对象进行单元测试_Java_Unit Testing_Mapreduce_Mockito - Fatal编程技术网

Java 如何使用mockito对自定义可写对象进行单元测试

Java 如何使用mockito对自定义可写对象进行单元测试,java,unit-testing,mapreduce,mockito,Java,Unit Testing,Mapreduce,Mockito,如果我有一个实现可写的自定义对象类,那么用mockito的单元测试测试序列化/反序列化是否正常工作的最佳方法是什么?我想创建模拟映射器/还原器,但这似乎太没有必要了 示例代码: public class CustomObj implements Writable { private String value; public CustomObj(String v) { value = v; } @Override public void

如果我有一个实现可写的自定义对象类,那么用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();
    }

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

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

您还需要测试边,例如,确保在可以使用的反序列化过程中重新创建/重新添加临时字段

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

下面是一个往返测试示例:

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

请添加一些代码。如何使用可写接口提供的DataInput和DataOutput手动序列化/反序列化?@Jin,编辑答案以包含示例代码-关键是使用ByteArrayInputStream可以获取序列化字节,然后使用ByteArrayInputStream反馈。注意:您的代码之所以失败,是因为您没有使用对称读写,请参见上面的示例,它使用了readUTF和writeUTF。啊,好的,我明白了,我肯定是把事情复杂化了,谢谢!