2

私は自分で実装WritableComparableしましたが、単体テストwritereadFieldsメソッドの良い方法を見つけることができません。

何か案は?

4

1 に答える 1

5

おそらく、書き込み可能なものをテストする簡単な方法を見つけることができますが、手動でシリアライゼーション/デシリアライゼーションを行うこともできます。例えば:

MyUtils.java:

...
import org.apache.commons.io.IOUtils;
...
public static byte[] serialize(Writable writable) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        DataOutputStream dataOut = null;
        try {
            dataOut = new DataOutputStream(out);
            writable.write(dataOut);
            return out.toByteArray();
        } 
        finally {
            IOUtils.closeQuietly(dataOut);
        }
    }

public static <T extends Writable> T asWritable(byte[] bytes, Class<T> clazz)
            throws IOException {
        T result = null;
        DataInputStream dataIn = null;
        try {
            result = clazz.newInstance();
            ByteArrayInputStream in = new ByteArrayInputStream(bytes);
            dataIn = new DataInputStream(in);
            result.readFields(dataIn);
        } catch (InstantiationException e) {
            // should not happen
            assert false;
        } catch (IllegalAccessException e) {
            // should not happen
            assert false;
        } finally {
            IOUtils.closeQuietly(dataIn);
        }
        return result;
    }

次に、テストクラスで:

CustomWritable record = ... ; //your initialized Writable
byte[] serializedBytes = MyUtils.serialize(record);

CustomWritable deserialized = 
  MyUtils.asWritable(serializedBytes, CustomWritable.class);

assertEquals("Value mismatch!", record.getFieldA(), deserialized.getFieldA());
...
于 2012-11-08T12:04:21.227 に答える