You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:20:42