IntelliJ 在运行所有测试时不会刷新多模块测试中的 Spring 自动配置

Posted

技术标签:

【中文标题】IntelliJ 在运行所有测试时不会刷新多模块测试中的 Spring 自动配置【英文标题】:IntelliJ does not refresh Spring autoconfigurations in multi-module tests when running all tests 【发布时间】:2020-10-10 10:25:05 【问题描述】:

我有一个多模块 Maven 项目,其中包含三个模块 ABC,它们都是 Spring-Boot 模块。

B 是一个自动配置类,使用 A。它对某个 bean 有条件。 C 也是一个自动配置类,也使用 A,它没有任何条件,因为它是一个非常小的模块,如果你把它放在你的 pom 中,你想要自动配置。

运行测试时:

mvn clean install 工作正常,一切顺利。 当我从 Intellij 运行每个 individual 模块的 JUnit 测试时,一切也都通过了。

问题是,当我尝试从 IntelliJ 运行所有测试时,模块 A(不依赖于任何东西的模块)失败,因为它声称它找不到模块 C 需要的 bean!我什至不能排除自动配置,因为模块 A 不依赖于 C 所以它不知道类。

当您有自动配置时,关于 IntelliJ 如何加载上下文,我有什么遗漏的吗?

【问题讨论】:

你使用什么运行配置?确切的错误是什么?可能与类路径的配置方式有关。通常,IDE 使用在 Run/Debug Configurations | 中指定的模块的类路径。 使用 JUnit 运行配置的模块的类路径(如果您使用 JUnit 配置)。 这听起来像youtrack.jetbrains.com/issue/IDEA-222014 报告。 【参考方案1】:

为后代回答我自己的问题。 这是假设所有模块共享同一个根包的部分答案。在我的例子中,所有模块共享a.b.c,其中第一个模块的包是a.b.c.first,第二个模块是a.b.c.second,依此类推。 如果您有更好的解决方案,我会很乐意更改已接受的答案。

问题在于您如何定义测试配置。由于这是一个多模块项目,并且我希望所有测试都运行,因此有两种定义它的方法:

有问题的方式:在整个项目上定义一个模式。此解决方案在this *** answer 中进行了描述。

运行此配置将导致问题中描述的问题 - 模块没有的依赖项的无关自动配置将开始失败,因此测试也会失败。

工作方式:这种方式是在所有模块共享同一个包的假设下工作的。创建一个新的运行配置如下:

测试种类:全包 包:所有模块的共享根包,例如a.b.c 在我在此答案开头给出的示例中。 搜索测试:在整个项目中

这将使用正确的自动配置运行所有测试。

【讨论】:

以上是关于IntelliJ 在运行所有测试时不会刷新多模块测试中的 Spring 自动配置的主要内容,如果未能解决你的问题,请参考以下文章

如何在多模块项目中使用 JUnit5 和 SpringBoot2 通过 gradle 而不是 intelliJ 运行测试

sbt-assembly 多模块项目?

使用 Spring Boot 和多模块的 Maven 配置 - 在 Intellij 中运行应用程序

intellij idea 将模块打jar包

Intellij Android + Maven 找不到单元测试

你不得不会的性能测试实战,绝对干货