java - 使用 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 的默认结构。
编辑:添加了执行资源加载的代码行
解决方案
在 Maven 中运行测试时,类路径target/classes
由target/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")
推荐阅读
- android - Flutter 错误:对空值使用空检查运算符
- python - 从另一个 python 脚本启动 python 脚本并在控制台中显示
- go - GRPC 流关闭连接
- ios - Affect on existing features in the app when Bitcode enabled vs disabled
- oauth - Canvas LMS LTI 1.3 JWS signature invalid 400 ERROR
- azure - azure-quickstart-templates for airflow 2
- mule - Sum with GroupBy in Nested Arrays in dataweave 2, Mule 4
- webpack - Resources not found after deploying with GitHub pages
- python - 如何加入 2 个数据框并基于过滤器 pyspark 添加新列
- c# - The "Example" task could not be loaded from the assembly - msbuild problem