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

在使用dbunit进行DAO单元测试时遇到org.dbunit.dataset.DataSetException: java.net.MalformedURLException异常,原因是无法读取t_user.xml文件。解决方案包括:将t_user.xml移动到测试根目录,使用TestDbUnit.class.getResourceAsStream()读取同包下的文件,或使用带前缀的路径读取特定包中的文件。

一、问题定位


   在使用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获取资源。


org.dbunit.dataset.DataSetException: error producing dataset for table 't_seven_meal_service_order_delivery_details_2' at org.dbunit.dataset.csv.CsvProducer.produce(CsvProducer.java:95) at org.dbunit.dataset.CachedDataSet.<init>(CachedDataSet.java:88) at org.dbunit.dataset.CachedDataSet.<init>(CachedDataSet.java:73) at org.dbunit.dataset.csv.CsvDataSet.<init>(CsvDataSet.java:43) at common.CsvDataSetLoader.createDataSet(CsvDataSetLoader.java:23) at com.github.springtestdbunit.dataset.AbstractDataSetLoader.loadDataSet(AbstractDataSetLoader.java:54) at com.github.springtestdbunit.DbUnitRunner.loadDataset(DbUnitRunner.java:209) at com.github.springtestdbunit.DbUnitRunner.loadDataSets(DbUnitRunner.java:192) at com.github.springtestdbunit.DbUnitRunner.setupOrTeardown(DbUnitRunner.java:173) at com.github.springtestdbunit.DbUnitRunner.beforeTestMethod(DbUnitRunner.java:75) at com.github.springtestdbunit.DbUnitTestExecutionListener.beforeTestMethod(DbUnitTestExecutionListener.java:185) at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:320) at org.springframework.test.context.junit.jupiter.SpringExtension.beforeEach(SpringExtension.java:240) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) Caused by: org.dbunit.dataset.csv.CsvParserException: Expected 23 columns on line 2, got 25. Offending line: "123456","5","1234567890123456789012345678901234","8d8e1f2a5d61d832c3b5ae1f2a5d6","6E656E6265","2","1","12","00","20241230","100","1","1","1234567890123","000001","123456","100","100","1","0","1000","2023-01-01 12:59:59","SPUA3544",'test',"0" at org.dbunit.dataset.csv.CsvParserImpl.collectExpectedNumberOfColumns(CsvParserImpl.java:196) at org.dbunit.dataset.csv.CsvParserImpl.parseTheData(CsvParserImpl.java:159) at org.dbunit.dataset.csv.CsvParserImpl.parse(CsvParserImpl.java:124) at org.dbunit.dataset.csv.CsvParserImpl.parse(CsvParserImpl.java:99) at org.dbunit.dataset.csv.CsvProducer.produceFromFile(CsvProducer.java:112) at org.dbunit.dataset.csv.CsvProducer.produce(CsvProducer.java:93) ... 14 more
最新发布
11-15
"original_store_code","created_datetime","pos_number","pos_sequence_number","amount","update_datetime","update_function_id","update_person_id","update_count" "123456",2024-07-08 19:58:43,"1","0555",99999999999,2025-10-09 17:59:57,"1","1",0 报错:org.dbunit.dataset.DataSetException: error producing dataset for table 't_journal_amount_information_s3' at org.dbunit.dataset.csv.CsvProducer.produce(CsvProducer.java:95) at org.dbunit.dataset.CachedDataSet.<init>(CachedDataSet.java:88) at org.dbunit.dataset.CachedDataSet.<init>(CachedDataSet.java:73) at org.dbunit.dataset.csv.CsvDataSet.<init>(CsvDataSet.java:43) at jp.co.sej.ssc.sh.common.CsvDataSetLoader.createDataSet(CsvDataSetLoader.java:23) at com.github.springtestdbunit.dataset.AbstractDataSetLoader.loadDataSet(AbstractDataSetLoader.java:54) at com.github.springtestdbunit.DbUnitRunner.loadDataset(DbUnitRunner.java:209) at com.github.springtestdbunit.DbUnitRunner.loadDataSets(DbUnitRunner.java:192) at com.github.springtestdbunit.DbUnitRunner.setupOrTeardown(DbUnitRunner.java:173) at com.github.springtestdbunit.DbUnitRunner.beforeTestMethod(DbUnitRunner.java:75) at com.github.springtestdbunit.DbUnitTestExecutionListener.beforeTestMethod(DbUnitTestExecutionListener.java:185) at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:320) at org.springframework.test.context.junit.jupiter.SpringExtension.beforeEach(SpringExtension.java:240) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) Caused by: org.dbunit.dataset.csv.CsvParserException: Expected 9 columns on line 2, got 1. Offending line: at org.dbunit.dataset.csv.CsvParserImpl.collectExpectedNumberOfColumns(CsvParserImpl.java:196) at org.dbunit.dataset.csv.CsvParserImpl.parseTheData(CsvParserImpl.java:159) at org.dbunit.dataset.csv.CsvParserImpl.parse(CsvParserImpl.java:124) at org.dbunit.dataset.csv.CsvParserImpl.parse(CsvParserImpl.java:99) at org.dbunit.dataset.csv.CsvProducer.produceFromFile(CsvProducer.java:112) at org.dbunit.dataset.csv.CsvProducer.produce(CsvProducer.java:93) ... 43 more
10-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值