我有一个具有以下结构的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
?
答案 0 :(得分:3)
尝试将您的Application (Annotated @SpringBootApplication)
类放在其他包的根包中。您的情况是io.example
软件包。
答案 1 :(得分:1)
@piradian已经提供了正确的答案,我将尝试解释为什么它是正确的。
@SpringBootTest
注释以其最简单的方式(没有参数)放置在测试中时,试图尽可能精确地模拟为测试启动微服务的过程。
关于配置检索,基本上应该执行两个步骤:
第一步,它首先尝试找到@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