加载测试文件仅在使用ClassLoader

时间:2017-11-19 03:52:58

标签: java intellij-idea junit java-8

我有一个多模块项目。我使用IntelliJ并将src / test / resources标记为测试资源目录。我把abc.txt放在那个目录里。

第一行为我执行的原因是什么,但第二行没有,但适用于其他人?

// this returns a stream
this.getClass().getClassLoader().getResourceAsStream("abc.txt"));
// this returns null
this.getClass().getResourceAsStream("abc.txt"));

我在阅读Google的前几次点击后发现了这些建议,用于加载测试文件。我不知道有什么细节可以让第二个人为某些人而不是我工作。

我发现了一些关于ClassLoader在某些极端情况下不起作用的提示。一旦我把它推到詹金斯身上,这会失败吗?

1 个答案:

答案 0 :(得分:1)

每个类都有一个为加载类定义的ClassLoader。在所讨论的上下文中,唯一的区别在于Class.getResourceAsStream如下:

this.getClass().getResourceAsStream("abc.txt"));

如果对象是由 引导类加载器 加载的,则该方法委托给ClassLoader.getSystemResourceAsStream(java.lang.String)然后使用搜索路径用于加载类以查找资源。

在委托任何类加载器之前,使用此算法从方法Class.getResourceAsStream中的给定资源名称构造绝对资源名称:

  • 如果名称以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。
  • 否则,绝对名称的格式如下: modified_pa​​ckage_name /名称

    其中modified_pa​​ckage_name是此对象的包名称,其中'/'替换为'。' ( '\ u002e')。

在您的情况下,后者变为真,因此无法找到资源。