有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有多个方法对象的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) 个答案

  1. # 1 楼答案

    在考虑单元测试时,您总是这样做:

    • 您将看到类X公开的公共接口。含义:将对该类的对象调用哪些方法;参数是什么;每种方法的合同是什么
    • 您编写的测试用例完全涵盖了每个方法的契约

    这告诉您:您的“方法类”(我更愿意称之为“服务类”)是密集单元测试的主题;为了确保他们提供的“服务”。。。实际上是交付的

    对于MapperClass,理论上可以重用这些测试用例;因为“真正公开的”合同可能是与MapperClass签订的

    当然,这意味着“代码重复”;仔细想想:MapperClass只“需要”某种“管道测试”。意思:您只需要测试这些方法类是否被正确调用以提供所需的结果。您不需要对MapperClass运行所有测试

    当避免在MapperClass中的方法中调用new时(例如,通过将方法对象转换为字段,并使用构造函数伸缩和依赖项注入),您甚至可以使用模拟框架来简单地检查:当我调用“外部”方法时;调用正确的方法对象

    不过有一个警告:当你没有完整的MapperClass“契约检查”套件,而你后来又决定再次重构时,你就“破产了”。因为所有契约检查测试代码都“附加”到特定的“方法类”。因此,您必须将所有这些测试移到“MapperClass范围”。因此,您应该有意识地做出这个决定(但我仍然主张不要重复测试代码;并采用上述解决方案——但您应该理解该决定的这一重要后果)