[英]How to test the abstract class methods?
如何测试抽象类? 我研究了它,发现需要创建一个模拟对象,但是如何创建一个模拟对象呢? 我不知道,有人可以帮忙吗? 例如,这是我的抽象类:
public abstract class Aging {
private int age;
public Aging(int age) {
setAge(age);
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
我试图使用以下代码来测试构造函数:
@Test
public void testAgingConstructor() {
Aging a = new Aging(18);
a.setAge(19);
Aging b = new Aging(19);
assertEquals(b, a);
}
我收到一条错误消息“老化是抽象的;无法实例化” 。 我该怎么办?
为了实例化您的抽象类,您需要创建一个具体的子类。
@Test
public void testAgingConstructor() {
class AgingSubclass extends Aging {
public AgingSubclass(int age) { super(age); }
}
Aging a = new AgingSubclass(18);
a.setAge(19);
Aging b = new AgingSubclass(19);
assertEquals(b, a);
}
我将创建一个新的非抽象类来扩展您的抽象类。它将是一个空类,除了带有extends子句的标头。 然后,您将可以测试在抽象类上实现的方法。
要问自己的问题是:
为什么我需要测试这堂课?
它是一类专门由其他模块扩展的类吗? 然后是的,您应该通过实际测试该用例进行测试:扩展您的抽象类,并验证所获得的行为是否符合预期。
这是将在您有一些实现的模块中使用的类吗? 然后,您很可能应该测试这些实现的行为,从而测试具体的类。
总而言之,您最终要测试的是一些扩展抽象类的具体类。
模拟允许您在测试类时不关心类的依赖关系,并且与您的问题无关。
如果不想麻烦编写具体的类,可以使用一个不错的技巧,就是利用匿名类:
@Test
public void testAgingConstructor() {
Aging a = new Aging(18){}; //Create anonymous subclass and instantiate it.
a.setAge(19);
Aging b = new Aging(19){};
assertEquals(b, a);
}
对于您的班级,应如下所示。 它显示了如何内联实现抽象类(花括号)。 如果抽象类中有抽象方法,则必须在大括号中覆盖并实现它们。
@Test
public void testAgingConstructor(){
Aging a =new Aging(18) {};
a.setAge(19);
Aging b =new Aging(19) {};
assertEquals(b,a);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.