dbunit之org.dbunit.dataset.DataSetException: java.net.MalformedURLException解决方法

一、问题定位


   在使用dbunit做DAO的单元测试时,抛出了一个org.dbunit.dataset.DataSetException: java.net.MalformedURLException异常,如下图,

dbunit之org.dbunit.dataset.DataSetException: java.net.MalformedURLException解决方法_第1张图片

可以看到问题出现在我写的TestDbUnit的49行,再看源代码

dbunit之org.dbunit.dataset.DataSetException: java.net.MalformedURLException解决方法_第2张图片

第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文件的位置,

dbunit之org.dbunit.dataset.DataSetException: java.net.MalformedURLException解决方法_第3张图片

t_use.xml文件是在dbunit_xml包下的,而解析它的TestDbUnit类是在zttc.itat.service包下的。


方法一:


    现在我们将t_use.xml文件移动到test根目录下,在运行发现问题解决:

dbunit之org.dbunit.dataset.DataSetException: java.net.MalformedURLException解决方法_第4张图片dbunit之org.dbunit.dataset.DataSetException: java.net.MalformedURLException解决方法_第5张图片

打印出的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同一个包下也同样可以解决问题:

dbunit之org.dbunit.dataset.DataSetException: java.net.MalformedURLException解决方法_第6张图片dbunit之org.dbunit.dataset.DataSetException: java.net.MalformedURLException解决方法_第7张图片


方法三:


    如果我就是想把t_user.xml放到dbunit_xml包下读取怎么办,可以用这个语句TestDbUnit.class.getResourceAsStream("/dbunit_xml/t_user.xml"),运行也没有错误

dbunit之org.dbunit.dataset.DataSetException: java.net.MalformedURLException解决方法_第8张图片


三、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获取资源。


你可能感兴趣的:(单元测试)