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 项目,其中包含三个模块 A
、B
、C
,它们都是 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 运行测试
使用 Spring Boot 和多模块的 Maven 配置 - 在 Intellij 中运行应用程序