標籤:
一、問題定位
在使用dbunit做DAO的單元測試時,拋出了一個org.dbunit.dataset.DataSetException: java.net.MalformedURLException異常,如,
可以看到問題出現在我寫的TestDbUnit的49行,再看原始碼
第49行是這一句 IDataset ds = new FlatXmlDataSet(file)。但實際出現問題的是file對象中的TestDbUnit.class.getClassLoader().getResourceAsStream("t_user.xml"),
我將這一句列印出來發現結果為:
結果為null,說明沒有讀到t_user.xml檔案,這也是產生org.dbunit.dataset.DataSetException: java.net.MalformedURLException的原因。
二、解決方案
問題的根源是t_use.xml檔案沒有被讀取,為什麼會產生這種情況能,首先看我t_user.xml檔案的位置,
t_use.xml檔案是在dbunit_xml包下的,而解析它的TestDbUnit類是在zttc.itat.service包下的。
方法一:
現在我們將t_use.xml檔案移動到test根目錄下,在運行發現問題解決:
列印出的TestDbUnit.class.getClassLoader().getResourceAsStream("t_user.xml")也不再為null。
方法二:
將TestDbUnit.class.getClassLoader().getResourceAsStream("t_user.xml")改為TestDbUnit.class.getResourceAsStream("t_user.xml")然後將t_user.xml移動到與TestDbUnit同一個包下也同樣可以解決問題:
方法三:
如果我就是想把t_user.xml放到dbunit_xml包下讀取怎麼辦,可以用這個語句TestDbUnit.class.getResourceAsStream("/dbunit_xml/t_user.xml"),運行也沒有錯誤
三、
Class.getResourceAsStream(String path) 與Class.getClassLoader.getResourceAsStream(String path)
1. Class.getResourceAsStream(String path) : path 不以’/‘開頭時預設是從此類所在的包下取資源,以’/‘開頭則是從ClassPath根下擷取。其只是通過path構造一個絕對路徑,最終還是由ClassLoader擷取資源。
2. Class.getClassLoader.getResourceAsStream(String path) :預設則是從ClassPath根下擷取,path不能以’/‘開頭,最終是由ClassLoader擷取資源。
dbunit之org.dbunit.dataset.DataSetException: java.net.MalformedURLException解決方案