Maven测试SpringBootTest引发无法找到需要使用@ContextConfiguration或@SpringBootTest的@SpringBootConfiguration

时间:2019-06-29 16:52:46

标签: java spring maven spring-boot

我有一个具有以下结构的spring boot项目

@RunWith(SpringRunner.class)
@SpringBootTest
public class IntTest {
  ...
}

IntTest 类中的代码看起来像

mvn test

当我从IntelliJ运行测试时,它运行良好。但是我从maven Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test 运行它会引发以下错误

mvn test

我阅读了SO中的一些文档和类似问题。 大多数解决方案可纠正源文件夹和测试文件夹之间的程序包对齐。就我而言这不是问题。

当我执行以下操作时,该测试运行良好,package io.example.main; import org.springframework.test.context.junit4.SpringRunner; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration; import io.example.config.AppConfig; import io.example.beans.Bean1; import io.example.beans.Bean2; @RunWith(SpringRunner.class) @ContextConfiguration(classes = { Application.class, AppConfig.class, Bean1.class, Bean2.class }) @SpringBootTest public class IntTest { ... @Autowired private Bean1 b1; @Autowired private Bean2 b2; @Test public void testRandom() { /* assert statements */ } } 明确定义了上下文依赖项

ContextConfiguration

我可以执行上述操作,但是有什么方法可以运行测试而无需显式定义| README.md | .vuepress -- config.js | package.json

2 个答案:

答案 0 :(得分:3)

尝试将您的Application (Annotated @SpringBootApplication)类放在其他包的根包中。您的情况是io.example软件包。

答案 1 :(得分:1)

@piradian已经提供了正确的答案,我将尝试解释为什么它是正确的。

@SpringBootTest注释以其最简单的方式(没有参数)放置在测试中时,试图尽可能精确地模拟为测试启动微服务的过程。

关于配置检索,基本上应该执行两个步骤:

  • 找到spring boot应用程序
  • 找到所有应加载的配置/组件

第一步,它首先尝试找到@SpringBootConfiguration批注。这是放置在@SpringBootApplication注释上的元注释。这是查找所有已注册组件/配置所必需的。

因此,它从测试所在的包(io.example.main)开始,如果它在同一包中找到带有@SpringBootConfiguration的类(是的,它找到了它)-那么这意味着基本软件包以搜索所有配置/组件。 如果找不到这样的类,则将其打包(io.example)并重新开始搜索,然后如果找不到(io

找到该类后,它开始从应用程序所在的包开始向下搜索配置/组件。这正是Spring Boot应用程序的工作方式。这是失败的根源:

io.example.main软件包没有任何“子软件包”,因此Spring Boot测试什么也没发现,这就是测试失败的原因。

如果将SpringBootApplication向上移动一个软件包,则可以解决此问题。 ,因为现在上述过程的第一步是在io.example.main包中搜索,什么也没找到,在io.example中搜索,找到所需的类,因此它是从第二步开始的地方。

现在,如果将@SpringBootTest@ContextConfiguration结合使用,这就像说要进行弹簧引导:“不要激活此两阶段搜索,只需采用我提供并启动的配置类从那里”。这就是为什么@ContextConfiguration

对您有用的原因