具有多个模块和多个主类的spring boot项目-单元测试失败

Posted

技术标签:

【中文标题】具有多个模块和多个主类的spring boot项目-单元测试失败【英文标题】:springboot project with multiple module and multiple main class -unit test failing 【发布时间】:2019-02-04 23:38:55 【问题描述】:

我正在尝试为具有多个模块的现有应用程序编写单元测试用例,每个模块中都有主类。有不止一个类有\@SpringBootApplication。我编写了一个简单的测试用例,但由于以下错误而失败。我怎样才能继续我的测试用例之一。

java.lang.IllegalStateException: 发现多个 @SpringBootConfiguration 注解的类 [通用 bean: 类 [com.marketshare.ReportingMainClass];范围=;摘要=假; 懒惰初始化=假;自动线模式=0;依赖检查=0; 自动接线候选=真;主要=假;工厂BeanName=空; 工厂方法名=空;初始化方法名=空;销毁方法名=空; 在文件 [C:\My Data\workspace\services2\microservices\Reporting-Microservice\build\classes\java\main\com\marketshare\ReportingMainClass.class], 通用 bean:类 [com.marketshare.SharedMain];范围=; 摘要=假;懒惰初始化=假;自动线模式=0;依赖检查=0; 自动接线候选=真;主要=假;工厂BeanName=空; 工厂方法名=空;初始化方法名=空;销毁方法名=空; 在 URL 中定义 [jar:file:/C:/My%20Data/workspace/services2/microservices/Shared-Module/build/libs/Shared-Module-1.0-SNAPSHOT.jar!/com/marketshare/SharedMain.class]] 在 org.springframework.util.Assert.state(Assert.java:70) 在 org.springframework.boot.test.context.SpringBootConfigurationFinder.scanPackage(SpringBootConfigurationFinder.java:69) 在 org.springframework.boot.test.context.SpringBootConfigurationFinder.findFromPackage(SpringBootConfigurationFinder.java:59) 在 org.springframework.boot.test.context.SpringBootConfigurationFinder.findFromClass(SpringBootConfigurationFinder.java:52)

这里是代码sn-p

@RunWith(SpringRunner.class)
@WebMvcTest(CustomReportController.class)
public class CustomReportControllerTest 


我只想对我的控制器进行单元测试。顺便说一句,我是春天世界的新手。

【问题讨论】:

Two Spring Boot projects both with @SpringBootApplication的可能重复 浏览了不同的文档,我了解到@WebMvcTest 足以单独测试控制器。您指定的链接正在使用 \@SpringBootTest 注释并根据我的理解加载完整的上下文。为了对我的控制器进行单元测试并使其快速运行,我只想测试这个控制器。 【参考方案1】:

@RunWith(SpringRunner.class) 将加载弹簧上下文。要仅测试控制器,您可以使用

@RunWith(MockitoJUnitRunner.class)
public class CustomReportControllerTest 


【讨论】:

谢谢@Vitor。我试过了,它奏效了。它也很快。那么\@RunWith(SpringRunner.class) 和我上面提到的另外两个有什么区别。【参考方案2】:

有一个简单的方法,你可以在你的test源文件夹下创建一个新的Spring Boot Application,比如TestApplication,就像

src\test\java\com\example\TestApplication.java

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan("......").
@EnableAsync
public class TestApplication 

    public static void main(String[] args) 
        SpringApplication.run(TestApplication.class, args);
    


并将你的包添加到@ComponentScan,你可以获得所有的spring boot容量,并且只适用于测试建议。

【讨论】:

【参考方案3】:

添加@SpringBootTest @RunWith(SpringRunner.class) @AutoConfigureMockMvc 在测试类和 Autowire MockMvc 上使用这些注解,然后您可以使用 mockMvc.perform 来测试 Controller 方法

【讨论】:

以上是关于具有多个模块和多个主类的spring boot项目-单元测试失败的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 构建没有主类的 Spring Boot 库

Spring Boot找不到主类多模块

spring-boot-maven-plugin多模块install问题

spring-boot-maven-plugin多模块install问题

使用 Flyway 和 Spring Boot 迁移具有不同生命周期的多个模式

无法为 Databricks 作业构建具有多个主类的 Spark 应用程序