使用ClassLoader和Maven Surefire加载的资源进行单元测试



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

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

主代码运行良好,但当我使用Maven Surefire插件运行测试时,我会出现以下错误:

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的默认结构。

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

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

target/classes用于存储已编译的类和资源(在src/main/java、src/main/resources下(target/test-classes用于存储已编译的测试类和测试资源(分别位于src/test/java和src/test/resources下(

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

例如,如果其文件src/main/resources/sample.xml,则应将其解析为:

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

最新更新