如何测试抽象类?我研究了它,发现我需要创建一个模拟对象,但是如何创建一个模拟对象呢?我不知道,有人可以帮忙吗?例如,这是我的抽象类:
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);
}
我收到错误消息“Aging is abstract;无法实例化”。我该怎么办?
答案 0 :(得分:2)
为了实例化您的抽象类,您需要创建一个具体的子类。
@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);
}
答案 1 :(得分:1)
我会创建一个新的非抽象类来扩展你的抽象类。除了带有extends子句的头之外,它将是一个空类。 然后你将能够测试在抽象类中实现的方法。
答案 2 :(得分:1)
要问自己的问题是:
为什么我需要测试这个课程?
这是一个专门由其他模块扩展的类吗?然后是的,你应该通过实际测试这个用例来测试它:扩展你的抽象类并验证你得到的行为是否是预期的。
它是一个将在您的模块中使用的类,您有一些实现吗?那么你应该最有可能测试这些实现的行为,从而测试具体的类。
总而言之,你最终会测试的是一些扩展你的抽象类的具体类。
Mocking允许您在测试时不关心类的依赖性,而与您的问题无关。
如果你不想写一个具体的类,你可以使用的一个很好的技巧是利用匿名类的使用:
@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);
}
答案 3 :(得分:0)
对于你的课程,它应该如下。它展示了如何实现内联抽象类(花括号)。如果抽象类中有抽象方法,则必须在大括号内覆盖并实现它们。
@Test
public void testAgingConstructor(){
Aging a =new Aging(18) {};
a.setAge(19);
Aging b =new Aging(19) {};
assertEquals(b,a);
}