测试扩展抽象类的类

时间:2017-06-27 13:03:37

标签: testing junit abstract-class

我需要为扩展抽象类的类编写测试。当我需要测试具有super引用的方法时,问题就开始了。所以代码看起来像这样:

public abstract class AbstractClass{
    public String someMethod();
}

public class MyClass extends AbstractClass {
    methodToTest(){
        //somecode
        super.someMethod();
    }
}

任何想法我应该如何绕过它?

编辑: 对不起,我还是新手进行单元测试,就在刚才发现为什么这个不能正常工作。上面示例中的MyClass实际上包含一个初始化块,它设置在AbstractClass中声明的someMethod使用的一些字段,因此new AbstractClass.someMethod()没有给我与super.someMethod相同的结果。而且,由于我无法初始化AbstractClass,因此无法获得所需的结果。我认为我需要以某种方式嘲笑它,但正如我所说,我是新手,并且不知道该怎么做

public abstract class AbstractClass{
    String fieldA;
    public String someMethod(){
        //does something with fieldA
    }
} 

public class MyClass extends AbstractClass {
    {
        setFieldA("something");
    }
    methodToTest(){
        //some code
        super.someMethod();
        //returns some string based on the fieldA value
   }
}

更新以下是我的代码的更新版本。请帮我写测试。我可能会从那里得到它:

public abstract class AbstractClass{
    String fieldA;
    public String someMethod(){
        fieldA = "String" + fieldA;
    }
} 

public class MyClass extends AbstractClass {
    {
        setFieldA("Another String");
    }
    methodToTest(){
        fieldA = fieldA + "Yet Another String";
        super.someMethod();
        return fieldA;
   }
}

1 个答案:

答案 0 :(得分:0)

您的问题不是单元测试;但更多的是一般误解如何使用抽象类。

首先:如果你的抽象类需要一个字段来完成它的工作,那么你最好使用一个setter。代替:

public abstract class Base {
  private final String thatField;
  public Base(String incoming) {
    thatField = incoming;
  }
..

public class Derived extends Base {
   public Derived(String incoming) {
     super(incoming);
   }

换句话说:该字段似乎是您的类的重要部分。所以明确说明。通过启用构造函数来设置它,您还可以确保

  • 您可以控制字段设置的时间/方式
  • 您从编译器获得帮助 - 通过使字段最终,当您忘记初始化时会出现错误

除此之外:当你开始测试某个类时...如果该类只是扩展了Object那么无关紧要;或者如果它扩展到其他类;甚至在扩展抽象类时也是如此。

这就是可以说的;鉴于您的示例不包含有关您的代码“真正”正在做什么的任何具体细节。