私は自分で実装WritableComparable
しましたが、単体テストwrite
とreadFields
メソッドの良い方法を見つけることができません。
何か案は?
私は自分で実装WritableComparable
しましたが、単体テストwrite
とreadFields
メソッドの良い方法を見つけることができません。
何か案は?
おそらく、書き込み可能なものをテストする簡単な方法を見つけることができますが、手動でシリアライゼーション/デシリアライゼーションを行うこともできます。例えば:
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());
...