具有多个方法对象的java测试类
我有一个包含一些复杂逻辑的类,所以我决定多次使用usemethod object来重构它
假设一个类如next:
public class MapperClass {
Entity entity = new Entity();
private final Item item;
public MapperClass(Item item) {
this.item = item;
}
public Entity getEntity() {
entity.setPrice(extractPrice());
//more long and complicated implementation
//mapped from item values
//entity.set....
//...
return entity;
}
private double extractPrice() {
double priceExtracted = 0d;
//Long and complicated implementation
//extracted from item
//...
return priceExtracted ;
}
private List<SubItem> getSubItemsMapped() {
//Long and complicated implementation
//extracted from item
//...
}
}
我将其重构为:
public class MapperClass{
private Entity entity = new Entity();
private final Item item;
public MapperClass(Item item) {
this.item = item;
}
public Entity getEntity() {
entity.setPrice(extractPrice());
entity.setSubEntities(getSubItemsMapped());
//more long and complicated implementation
//mapped from item values
//entity.set....
//...
return entity;
}
private double extractPrice() {
new PriceCalculator(item).getPrice();
}
private List<SubItem> getSubItemsMapped() {
new SubItemsMapper(item).getSubItems();
}
//More similar cases
}
因此,我有一个包含几个method objects
的类,它比一个复杂的类更干净
然后当我去做测试的时候,我怀疑如何测试这门课
使用method object测试类的最佳方法是什么
- 仅使用
method objects
测试类 - 独立测试所有类,方法对象类,然后测试带有方法对象的类,所有这些都是深入测试李>
- 测试所有类,但深入测试方法对象类,使用简单类检查带有方法对象的类是否至少由该方法对象映射李>
- 它有一个糟糕的设计,所以重新思考如何设计它,然后测试它李>
- 其他选择李>
在这些情况下通常做什么
# 1 楼答案
在考虑单元测试时,您总是这样做:
这告诉您:您的“方法类”(我更愿意称之为“服务类”)是密集单元测试的主题;为了确保他们提供的“服务”。。。实际上是交付的
对于MapperClass,理论上可以重用这些测试用例;因为“真正公开的”合同可能是与MapperClass签订的
当然,这意味着“代码重复”;仔细想想:MapperClass只“需要”某种“管道测试”。意思:您只需要测试这些方法类是否被正确调用以提供所需的结果。您不需要对MapperClass运行所有测试
当避免在MapperClass中的方法中调用
new
时(例如,通过将方法对象转换为字段,并使用构造函数伸缩和依赖项注入),您甚至可以使用模拟框架来简单地检查:当我调用“外部”方法时;调用正确的方法对象不过有一个警告:当你没有完整的MapperClass“契约检查”套件,而你后来又决定再次重构时,你就“破产了”。因为所有契约检查测试代码都“附加”到特定的“方法类”。因此,您必须将所有这些测试移到“MapperClass范围”。因此,您应该有意识地做出这个决定(但我仍然主张不要重复测试代码;并采用上述解决方案——但您应该理解该决定的这一重要后果)