使用URLClassloader加载测试类和运行junit测试时,资源url错误



我有两个maven项目。

项目1:用于加载项目2的junit测试类,并使用junit API以编程方式执行测试用例。

String[] classAndMethodNames = ["packageName.Classname","Methodname"];
LauncherDiscoveryRequestBuilder requestBuilder = LauncherDiscoveryRequestBuilder.request();
requestBuilder.selectors(selectMethod(urlClassLoader.loadClass(classAndMethodNames[0]), classAndMethodNames[1]));

项目2:https://github.com/apache/commons-csv/blob/master/src/test/java/org/apache/commons/csv/issues/JiraCsv248Test.java

项目2加载这个类并运行测试org.apache.commons.csv.issues#testJiraCsv248。

问题:此测试使用ClassLoader.getSystemClassLoader().getResourceAsStream()读取文件,现在是该文件的预期路径应该引用Project2测试类(Project2DIR/filepath),但实际上它是Project1/filepath。

有什么方法可以纠正这条路吗。

您可能应该参考ClassLoader.getSystemClassLoader()的Javadoc,但通常情况下,您使用正确URL的方法不会真正帮助您,因为类加载器不必总是解析URL。

你可以尝试两种方法:

  1. 在执行项目1时设置类路径,使项目1的测试资源先于项目2的任何内容找到
  2. 将系统属性java.system.class.loader设置为您自己的ClassLoader实现,该实现对项目1的资源有特殊处理,并将其他任何内容委托给真正的系统类加载器。这是一个非常棘手的解决方案,所以我更喜欢#1

对于#2,您应该在加载项目1的第一个类之前设置系统属性,并在之前保存原始系统类加载器,这样您就可以正确地委托所有非测试资源请求。

相关内容

  • 没有找到相关文章

最新更新