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

如何在Java单元测试中获取src目录下的资源文件引用?

解决单元测试中访问src/test/resources目录下文件的问题

你遇到的核心问题是:类加载器(class.getResource)只能访问类路径内的资源,也就是编译后target/test-classes里的文件,而src/test/resources属于源码目录,不在类路径中,所以不能通过类加载器获取,得直接用文件系统路径访问。下面是几个可行的方案:

  • 直接使用项目根相对路径构建File对象
    单元测试运行时的工作目录默认是项目根目录,所以可以直接写相对路径指向src下的文件:

    File srcFile = new File("src/test/resources/expected/file.json");
    

    这种方式简单直接,只要测试运行时工作目录没被修改就有效。

  • 通过系统属性获取项目根路径(更稳妥)
    用System.getProperty("user.dir")获取当前工作目录(即项目根),再拼接目标文件路径:

    String projectRoot = System.getProperty("user.dir");
    File srcFile = new File(projectRoot + "/src/test/resources/expected/file.json");
    

    这个方法能避免工作目录变化带来的问题,兼容性更好。

  • 如果用Maven,通过构建变量绑定项目根目录
    先在pom.xml的surefire插件中配置系统变量,把项目根目录传递到测试中:

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-surefire-plugin</artifactId>
          <configuration>
            <systemPropertyVariables>
              <project.basedir>${project.basedir}</project.basedir>
            </systemPropertyVariables>
          </configuration>
        </plugin>
      </plugins>
    </build>
    

    然后在测试代码中通过这个变量获取文件:

    String projectRoot = System.getProperty("project.basedir");
    File srcFile = new File(projectRoot + "/src/test/resources/expected/file.json");
    

    这种方式适合需要严格控制路径的场景。

注意:修改src/test/resources下的文件后,下次构建时Maven/Gradle会重新把这些文件复制到target/test-classes,所以如果需要同步更新类路径里的文件,可能需要触发一次资源复制操作(比如Maven执行process-test-resources目标)。

内容的提问来源于stack exchange,提问作者Vayas Zsolt Marton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:37:09