首页 > 解决方案 > 使用 ClassLoader 和 Maven Surefire 加载资源的单元测试

问题描述

我有一个 JavaFX 项目,它使用 getClassLoader().getResource 加载 FXML 文件,例如:

Main.class.getClassLoader().getResource("fxml/App.fxml"). 

主要代码运行良好,但是当我使用 Maven Surefire Plugin 运行测试时,出现此错误:

java.lang.IllegalStateException: Location is not set.
javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2459)
javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)

经过进一步调查,我发现在执行测试时调用 getClassLoader().getResource() 时,它尝试解析的路径位于“target/test-classes”文件夹中,而资源位于“target/classes”文件夹中。我该如何解决这个问题?如果相关,我的项目遵循 Maven 的默认结构。

编辑:添加了执行资源加载的代码行

标签: javamaventestingclassloadermaven-surefire-plugin

解决方案


在 Maven 中运行测试时,类路径target/classestarget/test-classes

target/classes用于存放编译后的类和资源(src/main/java 下,src/main/resources 下) target/test-classes用于存放编译后的测试类和测试资源(src/test/java 和 src/ 下)分别测试/资源)

你没有显示代码,getClassLoader().getResource()最重要的是这个 getResource 的参数 - 它是如何在运行时(在测试期间)得到解决的,所以很难说更多,但问题可能是这个参数不是正确指定。

例如,如果它的文件src/main/resources/sample.xml应该被解析为:

getClassLoader().getResource("/sample.xml")

推荐阅读