繁体   English   中英

如何测试抽象类的方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM