2014-01-17 36 views
4

這是我第一次編寫JUnit測試,並且遇到以下問題。我必須寫一個抽象類的測試,我被告知做這種方式: http://marcovaltas.com/2011/09/23/abstract-class-testing-using-junit.html測試抽象類拋出InstantiationException

然而,當我嘗試運行第一個測試,我得到一個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);    
} 

請注意,基地數獨是一個抽象類,HyperSudoku是一個孩子。

我已實現了以下的抽象方法BaseSudokuTest:

protected abstract BaseSudoku getObject(int size); 

而這裏的一個擴展BaseSudokuTestHyperSudokuTest實現:

@Override 
protected BaseSudoku getObject(int size) { //I need size for other implementations 
    return new HyperSudoku(); 
} 
+0

你能分享完整的堆棧跟蹤嗎? – Mureinik

+0

testSetNumber_3args導致一個錯誤:java.lang.InstantiationException java.lang.InstantiationException java.lang.reflect.Constructor.newInstance(Constructor.java:526) 這就是我得到的! – syfantid

+0

我會要求你發佈一個我們可以運行的最小測試用例,它會重現這一點。添加'BaseSudoku'和HyperSudoku'類。 –

回答

4

你說BaseSudokuTestabstract方法因此是abstract本身。

假設您通過BaseSudokuTest運行測試,Junit使用反射來創建測試類的實例。不能直接或通過反射來實例化抽象類。

將您的抽象方法移到其他類中。您的JUnit測試課程不能是abstract

或者運行你的HyperSudokuTest類。它將從BaseSudokuTest繼承@Test方法。

+0

JUnit會忽略抽象測試類,除非您單擊IDE中的類並嘗試明確運行該類......剛剛嘗試過之後,它完全給出了問題中的異常。 –

+0

@尼克我假設這是OP所做的。如果我們獲得更多細節,我會修改我的答案。 –

+0

我專門點了課,以便運行測試。 但是,我做了Test class抽象,因爲我在我發佈的教程中看到它,這是我的教授發給我的。它似乎在工作! – syfantid