2013-03-11 25 views
2

使用JUnit運行測試時我得到ClassNotFoundExceptionClassNotFoundException的使用JUnit使用Class.forName(..)的getInstance時,而新的()工作正常

我有一大堆的測試用例,測試類爲主。 Main類有一個方法,它接受一個表示數據類型的字符串,並使用Class.forName(argument).newInstance()在內部建立一個類型的實例。現在,當我手動測試時,方法本身工作正常。但在使用junit運行測試用例時,我得到ClassNotFoundException(在該方法中)傳入的數據類型。

然後我添加了一行:新的MyDataType被測試的方法。奇怪的是,opration成功,而我通過Class.forName(MyDataType).newInstance()創建實例的後續行失敗。

Class Main{ 

public void someMethod(String dataType){ 
new MyDataType(); // suceeds 
Class.forName(dataType).newInstance(); // got Exception when dataType = "MyDataType" 
} 
} 

這是爲什麼?當我谷歌搜索時,我發現一些答案暗示MyDataType.class可能不在classpath。由於新MyDataType()運行良好,我不認爲這是這種情況。

我的運行時和構建時間類路徑包括包含所需類的jar。

+0

沒有看到你的代碼,你怎麼樣清理項目,然後再次運行這個測試的任何問題,有時我得到這個這種問題並修復它。 – OQJF 2013-03-11 05:17:30

+0

已經嘗試過了,不工作! – broun 2013-03-11 05:23:00

+0

雖然我認爲原因是Class.forName(),原因是新的MyDataType()只是創建實例,而Class.forName()必須保證該類已被jvm加載或它會得到例外:classNotFound。 – OQJF 2013-03-11 06:00:07

回答

3

先給全限定名稱,它是由method需要:

Class.forName("com.package.where.class.exists.MyDataType").newInstance(); 
+0

它也沒有工作。得到異常說找不到文件/目錄 – broun 2013-03-11 05:16:19

+0

這工作正常,抱歉的previus評論,但爲什麼是完整的類名所需,而不僅僅是簡單的類名。有沒有辦法用簡單的名字動態加載一個類? – broun 2013-03-11 19:02:53

相關問題