一、问题描述
在spring cloud项目中使用@SpringBootTest
注解进行单元测试时,报如下错误
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
二、原因分析
由于是spring cloud项目,创建好common包模块下的子模块后,并不需求启动服务,删除多余文件时顺手给启动类和测试类都删除了,因为需要用到bean注入,又加上了
@SpringBootTest
注解,但是@SpringBootTest
注解需要配合@SpringBootApplication
注解使用,@SpringBootTest
会尝试从测试类所在包及其父包中寻找@SpringBootApplication
注解的主类。
触发场景:
- 测试类与主启动类不在同一包或其子包下。
- 项目或模块中没有主启动类(如测试独立模块)。
- 未正确配置 @SpringBootTest 的 classes 属性。
三、解决方案
- 确保测试类与主启动类在同一包或其子包下
标准项目结构:
src/
main/
java/
com/example/app/
Application.java # 主启动类(@SpringBootApplication)
test/
java/
com/example/app/ # 测试类应在此包或其子包下
Test.java # 测试类
测试类默认会扫描主启动类,无需额外配置。
- 显式指定主启动类
如果测试类无法与主类保持包结构一致,在@SpringBootTest
中直接指定主类:
@SpringBootTest(classes = Application.class) // 替换为你的主启动类
public class Test {
// 测试代码
}
- 模拟主启动类(适用于无主类的模块)
如果测试的是一个独立模块(没有主启动类),可创建一个测试专用的配置类,放在test包目录下就可以:
@SpringBootApplication
public class TestApplication { // 测试专用的伪启动类
}
// 测试类中指定使用此配置,直接把@SpringBootApplication注解加到测试类上也可以
@SpringBootTest(classes = TestApplication.class)
public class DatabaseConfigTest {
// 测试代码
}
- 去掉@SpringBootTest注解
如果不需要加载完整的 Spring 上下文,只是简单的代码测试,可以去掉@SpringBootTest
注解,只用@Test
就可以
import org.junit.jupiter.api.Test;
public class Test {
@Test
void test1() {
System.out.println(1);
}
}