如何测试抽象类方法?

时间:2015-04-02 20:57:39

标签: java

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

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;无法实例化”。我该怎么办?

4 个答案:

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