說冗餘的方法,主要的代碼,你有這樣的事情:跨越幾個單元測試/班
MyClass.java
public class MyClass {
public List<Obj1> create(List<ObjA> list) {
return (new MyClassCreator()).create(list);
}
// Similar methods for other CRUD operations
}
MyClassCreator.java
public class MyClassCreator {
Obj1Maker obj1Maker = new Obj1Maker();
public List<Obj1> create(List<ObjA> list) {
List<Obj1> converted = new List<Obj1>();
for(ObjA objA : list)
converted.add(obj1Maker.convert(objA));
return converted;
}
}
Obj1Maker.java
public class Obj1Maker {
public Obj1 convert(ObjA objA) {
Obj1 obj1 = new Obj1();
obj1.setProp(formatObjAProperty(objA));
return obj1;
}
private String formatObjAProperty(ObjA objA) {
// get objA prop and do some manipulation on it
}
}
假設爲Obj1Maker單元測試已經完成,並涉及一種方法makeObjAMock()
它嘲笑複雜的對象A.
我的問題:
單元測試MyClassCreator,我會怎樣測試
create(List<ObjA> list)
?所有的方法確實是將代碼從ObjA
轉換爲Obj1
,並在循環中運行它。轉換本身已經過測試。如果我要創建一個ObjA
的列表並測試Obj1
列表中的每個對象,那麼我必須將makeObjAMock()
複製到MyClassCreator的單元測試中。顯然,這將是重複的代碼,所以正在使用verify()
足以確保create(List list)的作用?對於單元測試MyClass,它的
create(List<ObjA>)
方法再次將操作委託給MyClassCreator。我是否真的需要用完整的測試用例來測試它,還是應該驗證MyClassCreator的create
方法是否被調用?在Obj1Maker的單元測試中,我通過執行
assertEquals(obj1.getProp(), formatObjAProperty(objA))
來檢查屬性Obj1和ObjA是否相互對應。但是,這意味着我不得不將Obj1Maker類中私有方法formatObjAProperty
的代碼複製到其單元測試中。在這種情況下如何防止代碼重複?我不想公開/保護這種方法,所以我可以在單元測試中使用它。在這種情況下重複是否可以接受?
謝謝,並且對冗長的問題感到抱歉。