一、问题定位
在使用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获取资源。