2015-04-02 179 views
1

如何测试抽象类?我研究了它,发现我需要创建一个模拟对象,但是如何创建一个模拟对象?我不知道,有人可以帮忙吗?例如,这是我的抽象类:如何测试抽象类的方法?

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); 
} 

,我得到一个错误消息“老龄化是抽象的,不能被实例化” 。我该怎么办?

回答

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); 
} 
+0

像其他人一样说,不需要测试抽象类。我需要的只是测试子类,并确保他们使用超类的正确方法。谢谢 – Lenic 2015-04-02 21:23:17

1

我会创建一个扩展您的抽象class.it将是一个新的非抽象类是空类除与扩展条款的标题。 然后你将能够测试你在抽象类中实现的方法。

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); 
} 
0

为你的类应该是如下。它演示了如何实现内联抽象类(花括号)。如果在抽象类中有抽象方法,则必须在大括号内覆盖和实现它们。

@Test 
public void testAgingConstructor(){ 
    Aging a =new Aging(18) {}; 
    a.setAge(19); 
    Aging b =new Aging(19) {}; 
    assertEquals(b,a); 
}