这是我第一次编写JUnit测试,我遇到了以下问题。我必须为抽象类编写测试,并且我被告知这样做: http://marcovaltas.com/2011/09/23/abstract-class-testing-using-junit.html
然而,当我尝试运行第一个测试时,我得到InstantiationException
,如下所示:
java.lang.InstantiationException
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
这是我正在运行的测试:
/**
* Test of setNumber method, of class BaseSudoku.
*/
@Test
public void testSetNumber_3args() {
System.out.println("setNumber");
BaseSudoku b = getObject(9);
boolean expResult = false;
boolean result = b.setNumber(0, -7, 7);
assertEquals(expResult, result);
}
请注意,Base Sudoku是一个抽象类,而HyperSudoku是一个子类。
我在BaseSudokuTest中实现了以下抽象方法:
protected abstract BaseSudoku getObject(int size);
以下是HyperSudokuTest
中的实施,它扩展了BaseSudokuTest
:
@Override
protected BaseSudoku getObject(int size) { //I need size for other implementations
return new HyperSudoku();
}
答案 0 :(得分:6)
您已声明BaseSudokuTest
具有abstract
方法,因此abstract
本身。
假设您正在通过BaseSudokuTest
运行测试,Junit使用反射来创建测试类的实例。无论是直接还是通过反射,都无法实例化抽象类。
将您的抽象方法移动到其他类。您的JUnit测试类不能是abstract
。
或者更确切地说,运行HyperSudokuTest
课程。它将继承@Test
中的BaseSudokuTest
方法。
答案 1 :(得分:0)
我遇到了类似的问题,这是由于将我的抽象测试类添加到TestSuite引起的:
import junit.framework.TestSuite;
public class AllTests {
public static TestSuite suite(){
TestSuite suite = new TestSuite();
suite.addTestSuite(SessionTest.class); // Abstract class
suite.addTestSuite(CourseSessionTest.class); // Extends SessionTest
return suite;
}
}
从我的TestSuite中取出SessionTest.class解决了我的问题,因为我试图通过将抽象类添加到套件中来实例化一个抽象类(这是错误的出处),而CourseSessionTest正在调用其中的所有方法无论如何。