我想进行单元测试,确保所有子类都实现一个方法。
有些代码可能更好地解释我要做的事情。
超级班是这样的:
class SuperClass
{
public boolean isImportant()
{
throw customException;
}
}
现在说我有子类A
和B
。
我想确保这些包含在这些课程中,如:
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();
}
因为这将遍历所有子类,无论是否添加或删除了某些子类,如果抛出异常将会失败。
有没有办法做到这一点?
答案 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
它。 这可能是最干净的方法。