在主代码中说,你有这样的东西:
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
toObj1
并在循环中运行它。转换本身已经过测试。如果我要创建一个列表ObjA
并测试我返回的列表中的每个对象Obj1
,我将不得不复制makeObjAMock()
到 MyClassCreator 的单元测试中。显然,这将是重复的代码,所以使用verify()
足以确保 create(List list) 有效吗?对于 MyClass 的单元测试,同样,它的
create(List<ObjA>)
方法只是将操作委托给 MyClassCreator。我真的需要用完整的测试用例来测试它,还是应该只验证 MyClassCreator 的create
方法是否被调用?在 Obj1Maker 的单元测试中,我通过做来检查属性 Obj1 和 ObjA 是否相互对应
assertEquals(obj1.getProp(), formatObjAProperty(objA))
。但是,这意味着我必须将formatObjAProperty
Obj1Maker 类中的私有方法的代码复制到其单元测试中。在这种情况下如何防止代码重复?我不想让这个方法公开/受保护,这样我就可以在单元测试中使用它。在这种情况下可以接受重复吗?
谢谢,对冗长的问题感到抱歉。