2013-04-25 93 views
2

如果我有一個實現Writable的自定義對象類,那麼測試序列化/反序列化的最佳方法是否正確使用mockito進行單元測試?我正在考慮創建模擬映射器/縮減器,但似乎太不必要了。如何使用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(); 
    } 
+0

請添加一些代碼。 – MariuszS 2013-04-25 21:11:39

回答

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

如何使用Writable接口提供的DataInput和DataOutput來手動序列化/反序列化? – Jin 2013-04-25 22:56:30

+1

@Jin編輯答案以包含示例代碼 - 關鍵是使用ByteArrayOutputStream允許我們獲取序列化的字節,然後使用ByteArrayInputStream反饋回來。注意:由於您沒有使用對稱讀寫,因此代碼失敗,請參閱上面使用readUTF和writeUTF的示例。 – earcam 2013-04-25 23:13:21

+0

啊,好吧,我明白了,我絕對是過於複雜的事情,謝謝! – Jin 2013-04-26 00:00:45

相關問題