IntelliJ IDEA中DBUnit测试FileInputStream找不到XML文件问题
分析与解决方案
这个错误的核心原因是资源路径不匹配 + 错误的资源读取方式,咱们一步步拆解问题并给出解决办法:
1. 路径不匹配的核心问题
你代码里指定的路径是:
ru/iteco/blockchain/rzd/cred/core/server/db/hibernate/dao/contract/contract-data.xml
但实际XML文件所在的src/test/resources目录下,是用点分隔的完整包名作为单个文件夹名:
/src/test/resources/ru.iteco.blockchain.rzd.cred.core.server.db.hibernate.dao.contract/contract-data.xml
这两个路径完全对应不上,编译器自然找不到目标文件。
2. 错误的资源读取方式
你使用FileInputStream读取文件,它是从文件系统路径(默认是项目根目录)加载文件,而src/test/resources下的文件在测试运行时会被打包到类路径中,应该用类加载器读取类路径资源——这种方式更灵活,不受项目部署路径变化的影响。
推荐解决方案(符合规范的做法)
第一步:修正resources目录结构(对齐Maven/Gradle规范)
把src/test/resources下的ru.iteco.blockchain.rzd.cred.core.server.db.hibernate.dao.contract文件夹,拆分成和代码包结构一致的层级目录:
src/test/resources/ └── ru/ └── iteco/ └── blockchain/ └── rzd/ └── cred/ └── core/ └── server/ └── db/ └── hibernate/ └── dao/ └── contract/ └── contract-data.xml
第二步:用类加载器读取资源
修改setUp方法,替换原来的FileInputStream,改用类加载器获取资源流:
@Before public void setUp() throws Exception { super.setUp(); // 从类根目录开始读取资源,路径开头的/表示类路径根 InputStream resourceStream = getClass().getResourceAsStream("/ru/iteco/blockchain/rzd/cred/core/server/db/hibernate/dao/contract/contract-data.xml"); beforeData = new FlatXmlDataSet(new InputStreamReader(resourceStream, "utf-8")); tester.setDataSet(beforeData); tester.onSetup(); }
临时解决方案(不修改目录结构)
如果你暂时不想调整目录结构,也可以直接用类加载器读取当前的资源路径,不过这种点分隔的文件夹名不符合常规规范,不推荐长期使用:
@Before public void setUp() throws Exception { super.setUp(); InputStream resourceStream = getClass().getResourceAsStream("/ru.iteco.blockchain.rzd.cred.core.server.db.hibernate.dao.contract/contract-data.xml"); beforeData = new FlatXmlDataSet(new InputStreamReader(resourceStream, "utf-8")); tester.setDataSet(beforeData); tester.onSetup(); }
为什么不推荐用FileInputStream?
如果硬要用FileInputStream,你需要写完整的相对路径(相对于项目根目录):
new FileInputStream("src/test/resources/ru.iteco.blockchain.rzd.cred.core.server.db.hibernate.dao.contract/contract-data.xml")
但这种写法非常脆弱——一旦项目部署路径变化,或者构建工具的输出目录调整,代码就会失效,所以优先用类加载器读取类路径资源是更可靠的做法。
内容的提问来源于stack exchange,提问作者Ekaterina Pichkur
相关产品推荐
相关产品推荐

