IntelliJ无法找到类路径测试资源。

67
我遇到了问题,即当我运行一个单元测试时,IntelliJ 13.1.4找不到我的模块的src/test/resources目录中的ServiceLoader文件。 在回答之前,请注意我已经完成了以下所有步骤:
1.该模块是Gradle项目,如果我运行gradle test,那么单元测试会正常运行。 2.我以前曾成功地在IntelliJ中运行过这个单元测试,并且它找到了该模块。(也许是较早版本的IntelliJ?) 3.我已经仔细检查了IntelliJ模块设置,src/test/resources目录被标记为测试资源目录。(请参见下面的屏幕截图。) 4.我在类中转储了单位测试类的类加载器的类路径; 它具有build/classes/test/和build/classes/java目录,但没有build/resources/test/或build/resources/main/。 5.我点击了刷新所有Gradle项目的按钮。
还有其他原因导致IntelliJ在这里失败吗?
我的模块配置截图,显示了Test Resource Folders设置。

3
编译器对话框中的资源模式可能是什么? - matt helliwell
好主意!我刚刚检查了一下,我有!?*.java;!?*.form;!?*.class;!?*.groovy;!?*.scala;!?*.flex;!?*.kt;!?*.clj。我尝试将我的文件名添加到其中,但没有任何区别;当测试运行时打印的类路径仍然不包括src/test/resources/目录。 - Luis Casillas
3
我在这里遇到了完全相同的问题......使用的是Intellij 13.1.4。 - Pedro Dusso
你加载资源的代码是什么? - bacar
你是否将dynamic.classpath设置为true?我发现类似的问题(在一个maven项目中)当这个设置开启时,某些类加载器的classpath没有正确设置。该设置位于.idea/workspace.xml文件中。 - bacar
显示剩余4条评论
9个回答

35

通过在 test 目录的同级目录下创建一个 test-resources 目录,我成功改进了它的工作方式。

尽管如此,仍然会偶尔出现问题。这些时候,可以打开 IntelliJ 项目设置并将测试资源定义为 (Gradle 项目将保持不变)。

这一定是 IntelliJ 的 bug,因为我在 Android Studio 中也遇到了同样的问题。

编辑:

我在这里找到了解决方法。

在 Gradle 配置文件末尾添加以下内容(并指定你的测试资源路径):

task copyTestResources(type: Copy) {
    from "${projectDir}/src/test/resources"
    into "${buildDir}/classes/test"
}
processTestResources.dependsOn copyTestResources

你向Jetbrains支持团队报告了吗?他们的响应速度相当快。我认为正确实现Gradle支持不应该需要显式复制资源。 - bacar
7
看起来已经有类似的问题被报告了:https://youtrack.jetbrains.com/issue/IDEA-128273。 - Kristofer Sommestad
我没有机会测试你提出的解决方案,因为不知何故我再也无法重现我的原始问题了。 - Luis Casillas
作为更新,上述提到的 IDEA bug 被显示为重复 bug,主要 bug 是:https://youtrack.jetbrains.com/issue/IDEA-91952。 - JCricket
2
使用Maven时遇到了同样的问题。你有什么想法,关于如何在Maven中实现你的修复等效方法吗?我有一些依赖于某些平面文件的测试,而Maven可以在控制台中找到它们,但IntelliJ却声称找不到它们。 - Rig
抱歉,但是不行... :( - Kristofer Sommestad

32
我在使用IntelliJ 14时遇到了类似的问题。尽管我在资源文件夹中有必要的文件,并确保该文件夹在模块设置中被指定为资源,但是IntelliJ会间歇性地无法将我的文件加载到类路径中。
一个解决方法是在模块设置中将所需的文件夹添加为该模块的依赖项。

enter image description here

首先,点击“+”按钮添加新依赖项。

enter image description here

然后,选择您希望添加到类路径的文件夹。

enter image description here

然后选择“classes”选项。

enter image description here

一旦完成此操作,重新构建您的模块,希望这样就能解决问题。
理想情况下,这不应该成为问题。资源文件夹中的所有文件都应直接放在类路径中。然而,每个IDE都有其特点。

4
谢谢修复,现在可以用了!截至我写这条评论的日期,似乎仍然存在问题。 - Matthew Chen
1
这确实可行,但在Gradle项目中的问题是,对模块设置所做的任何更改都将在下次进行Gradle同步时丢失(因此项目中的模块都会被刷新)。如果有一种方法可以通过模块的build.gradle文件进行更改,那就太好了! - Adil Hussain
1
@AdilHussain 我在这方面使用的是Maven。但是,当我在命令提示符下运行Maven时,我的单元测试能够正常工作,但是在通过IntelliJ运行时失败了。我遇到的问题是与IDE有关,而不是构建工具特定的。 - Aditya Satyavada
我仍然面临这个问题,到现在还没有解决。 - saurzcode
这个可以运行,但我的项目是SBT,当重新导入SBT文件时,更改就会丢失。 :( - John Arrowwood

18

当我遇到相同问题时,我成功解决了它,只需将资源目录取消标记为资源根目录,然后再将其标记为资源根目录:

  1. 右键单击资源文件夹 > 标记目录为... > 取消标记为资源根目录
  2. 右键单击资源文件夹 > 标记目录为... > 测试资源根目录

1
我确认这个hack可以解决问题。但是如果有人能够解释为什么Intellij IDEA在2020年还会出现这种情况,我会很感激的。已在2020.3 EAP上测试过。 - redochka

6

在我的情况下,我只是通过maven命令行运行测试,即基本的mvn clean install。之后,在IDEA中它就可以工作了。


2

在一个多模块项目中,IntelliJ往往会将顶层模块设置为工作目录。如果是这种情况,可以尝试将其更改为子模块目录。


1
如果您的项目是多模块Maven,而其他答案无法解决问题,请尝试以下方法。在Intellij中更改工作目录。右键单击,转到编辑配置,选择您想要运行的所需Maven项目目录。

enter image description here


1

我最近遇到了这个问题,junit测试无法在 src/test/resources 目录中找到资源。

我在 pom.xml 文件中发现了一个错误的 <packaging>pom</packaging>,删除后问题得到解决。


将代码移动到子模块而不是父聚合模块对我起了作用。https://dev59.com/LGMl5IYBdhLWcg3wDjSg#18735578 - ahiijny

0
对我来说,Build -> Recompile 创建了在项目结构中描述的 out 文件夹,然后它就可以找到我的类。 输入图像描述

-2

我遇到了同样的问题,Junit失败(FileNotFound),因为我的根项目文件夹中有空格。例如:my project/project1/....

  • 我从根文件夹中移除了空格,my_project/project1/ 所有测试都通过了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接