测试抽象类会抛出InstantiationException

时间:2014-01-17 15:47:19

标签: java exception junit

这是我第一次编写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();
}

2 个答案:

答案 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正在调用其中的所有方法无论如何。