如何进行单元测试以确保所有子类实现方法?

时间:2015-09-02 23:47:59

标签: java unit-testing

我想进行单元测试,确保所有子类都实现一个方法。

有些代码可能更好地解释我要做的事情。

超级班是这样的:

class SuperClass
{
    public boolean isImportant()
    {
        throw customException;
    } 
}

现在说我有子类AB

我想确保这些包含在这些课程中,如:

class A extends SuperClass
{
    @Override
    public boolean isImportant()
    { 
        return true; //or false
    }
}

和b类:

class B extends SuperClass
{
}

现在,如果我B b = new B(); b.isImportant(),我将获得例外。

不是对每个类进行测试(有很多,我可能会错过一些,将来可能会添加更多的子类),我怎样才能轻松测试它。

我在想是否有办法实例化每个子类的对象。

这样的事情:

for(Class subClass : SuperClass.subclasses)
{
   subClass obj = new subClass();
   obj.isImportant();
}

因为这将遍历所有子类,无论是否添加或删除了某些子类,如果抛出异常将会失败。

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:2)

使方法abstract和子类必须实现它,否则它们将无法编译。无需进行单元测试(无论如何)。

<强>更新

现在,如果您不能(或不想)将方法更改为abstract,则可以像这样进行测试。

class SuperClass {
    public boolean isImportant() { throw new UnsupportedOperationException(); } 
}

class A extends SuperClass {
    @Override
    public boolean isImportant() { return true; }
}

class B extends SuperClass {
}

class TestIsImportant {

    @SuppressWarnings("unchecked")
    private static final Class<?>[] classesToTest = new Class[] {
        A.class, B.class
    };

    @Test
    public void test() throws Exception {
        for (Class<?> classToTest : classesToTest) {
            classToTest.getDeclaredMethod("isImportant");
        }
    }

}

如果没有实现方法,这将抛出NoSuchMethodException,并且很容易添加到要测试的类列表中。

答案 1 :(得分:2)

我认为您尝试测试的内容很奇怪,您应该选择@Andreas的解决方案:

  

使方法变得抽象,子类必须实现它,或者它们   不会编译。无需进行单元测试(无论如何)。

话虽如此,以下是您如何测试自己想要的内容:

dd.map(function(element)
{
    return { data: element };
});

现在,如果您希望能够遍历所有public class SuperClass { public void method() { System.out.println("Default implementation."); } } public class SubClassA extends SuperClass { @Override public void method() { System.out.println("Overridden implementation."); } } public class SubClassB extends SuperClass {} public class TestClass { @Test public void test() throws NoSuchMethodException { // nothing happens here SubClassA.class.getDeclaredMethod("isImportant"); // the line below throws NoSuchMethodException, failing the test SubClassB.class.getDeclaredMethod("isImportant"); } } 子类,那么您应该看一下: How do you find all subclasses of a given class in Java?

答案 2 :(得分:0)

我不明白你认为单元测试与你的继承有什么关系。如果您需要确保在子类中实现/继承isImportant(),只需将A和B extend设为SuperClass即可。然后,您可以确保所有子类永远都具有SuperClass的所有方法。

class A extends SuperClass {
...

如果该方法未在超类中实现,但您仍想执行已编写的内容,请创建SuperClass abstract

或者最后,定义一个interface,如:

interface SuperInterface {
   boolean isImportant();
}

...并将A和B设为implement它。 这可能是最干净的方法。