【问题标题】:IntelliJ can't find classpath test resourceIntelliJ 找不到类路径测试资源
【发布时间】:2014-10-20 05:58:47
【问题描述】:

我遇到的问题是 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 在这里失败的任何想法?


我的模块配置的屏幕截图,显示了测试资源文件夹设置。

【问题讨论】:

  • 编译器对话框中的资源模式可能是什么?
  • 好主意!我刚刚检查过,我有!?*.java;!?*.form;!?*.class;!?*.groovy;!?*.scala;!?*.flex;!?*.kt;!?*.clj。我尝试将我的文件名添加到其中,但没有任何区别;测试运行时打印的类路径仍然不包含src/test/resources/ 目录。
  • 我在这里遇到了完全相同的问题... Intellij 13.1.4
  • 加载资源的代码是什么?
  • @bacar:我自己不直接加载;它是由我使用的库 (junit-quickchek) 完成的。但我确实知道该库使用 Java 平台的 ServiceLoader 类。

标签: java intellij-idea classpath


【解决方案1】:

我通过创建一个与test 目录平行的test-resources 目录(!),设法让它更好地工作。

不过,仍然会出现间歇性问题。那时,可以打开 IntelliJ 项目设置并将测试资源定义为 source(Gradle 项目将保持不变)。

一定是 IntelliJ 错误,因为我在 Android Studio 中遇到过同样的事情。

编辑:

found a workaround这个问题。

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

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

【讨论】:

  • 您是否已将此情况报告给 Jetbrains 支持人员?他们反应灵敏。我原以为正确实现 gradle 支持不需要显式复制资源。
  • @bacar 似乎已经报告了类似的问题:youtrack.jetbrains.com/issue/IDEA-128273
  • 我没有机会测试您提出的解决方案,因为我无法再重现我原来的问题。
  • 作为更新,上述 IDEA 错误显示为重复,主要错误是:youtrack.jetbrains.com/issue/IDEA-91952
  • 在 Maven 中体验相同。仍然。知道您的修复程序的 Maven 等效项是什么吗?我有一些依赖于一些平面文件的测试,Maven 在控制台中找到了它们,但 IntelliJ 爆炸声称找不到它们。
【解决方案2】:

我在使用 IntelliJ 14 时遇到了类似的问题。尽管我的资源文件夹中有必要的文件并确保该文件夹在模块设置中被指定为资源,但 IntelliJ 间歇性地无法将我的文件加载到类路径中。

一种解决方法是在模块设置中添加所需的文件夹作为模块的依赖项。

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

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

然后选择“类”选项。

完成后,重新构建您的模块一次,希望这样可以解决问题。

理想情况下,这根本不是问题。资源文件夹中的所有文件都应该直接放在类路径中。然而,每个 IDE 都有它的怪癖。

【讨论】:

  • 感谢修复成功!截至我撰写此评论之日,这似乎仍然存在问题。
  • 这确实有效,但在 Gradle 项目中这样做的问题是,在下一次发生 Gradle 同步时,对模块设置所做的任何更改都将丢失(因此项目中的模块全部刷新)。如果有办法通过模块的build.gradle 文件进行此更改,那就太好了!
  • @AdilHussain 我为此使用了 maven。但是,我的单元测试是通过使用命令提示符运行 maven 来工作的,但是在通过 intelliJ 运行时却失败了。我面临的是特定于 IDE 的。不是特定于构建工具的。
  • 我仍然面临这个问题,到现在还没有解决。
  • 这个可行,但是我的项目是SBT,重新导入SBT文件时,更改丢失。 :(
【解决方案3】:

当我遇到同样的问题时,我可以将资源目录取消标记为资源根目录,然后再次将其标记为资源根目录:

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

【讨论】:

  • 我确认这个 hack 可以解决问题。但如果有人能解释为什么 intellij IDEA 在 2020 年这样做,我将不胜感激。在 2020.3 EAP 上测试
【解决方案4】:

就我而言,我只是通过 maven 命令行运行测试,即基本的mvn clean install。之后它在 IDEA 中工作。

【讨论】:

    【解决方案5】:

    当有一个多模块项目时,IntelliJ 倾向于将顶层模块设置为工作目录。如果是这种情况,可以尝试将其更改为子模块目录。

    【讨论】:

      【解决方案6】:

      如果您的项目是多 maven 并且其他答案不起作用,请尝试这个。

      更改 intellij 中的工作目录。右键,编辑配置,选择需要运行的maven项目目录。

      【讨论】:

        【解决方案7】:

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

        • 我从根文件夹 my_project/project1/ 中删除了空间,所有测试都正确通过。

        【讨论】:

          【解决方案8】:

          对我来说,Build -> Recompile 创建了项目结构中描述的 out 文件夹。然后它可以找到我的课程。

          【讨论】:

            猜你喜欢
            • 2016-06-15
            • 1970-01-01
            • 1970-01-01
            • 2023-03-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-07-18
            • 2011-04-04
            相关资源
            最近更新 更多