如下所示的一个@SpringBootTest测试类,为什么需要单独配置一个 @SpringBootConfiguration ?
package com.fuyo.dic.workbench.system;
import org.junit.jupiter.api.Test;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = Test_01.TestApplication.class)
public class Test_01 {
/**
* 测试应用
*/
@SpringBootConfiguration
static class TestApplication {
}
@Test
public void test_01() {
System.out.println("xxxyyyzzz");
}
}
原因
- `@SpringBootTest` 默认会“自动向上查找”一个 Spring Boot 启动配置类。
- 这个“启动配置类”通常是 `@SpringBootApplication` 标注的类,而 `@SpringBootApplication` 本身就“包含了” `@SpringBootConfiguration`。
- 所以很多测试类里“不用自己写” `@SpringBootConfiguration`,是因为项目里已经有一个可被自动找到的 `@SpringBootApplication`。
为什么 `Test_01` 需要
- 你的 [Test_01.java](/Workbench-System/src/test/java/com/fuyo/dic/workbench/system/Test_01.java) 位于包 `com.fuyo.dic.workbench.system`
- `Workbench-System` 模块里**没有**一个位于这条包路径向上的 Spring Boot 启动类
- 所以前面报错才会是:
- `Unable to find a @SpringBootConfiguration by searching packages upwards from the test`
也就是说,对 `Test_01` 来说:
- Spring Boot 想自动找启动类
- 但在 `com.fuyo.dic.workbench.system` 这条路径上找不到
- 所以你就需要自己补一个最小的 `@SpringBootConfiguration`
为什么 `Workbench-Launch` 里的测试不需要?
- `Workbench-Launch` 模块本身有启动类 [LaunchApp](/Workbench-Launch/src/main/java/com/fuyo/dic/workbench/launch/LaunchApp.java)
- 它标了 `@SpringBootApplication`
- 而 `@SpringBootApplication` = 包含 `@SpringBootConfiguration`
- 所以只要测试类包路径合适,`@SpringBootTest` 就能自动找到它,不需要你再手写一个
一句话区别
- `Workbench-Launch`:**已有可自动发现的启动类**
- `Workbench-System/Test_01`:**没有可自动发现的启动类**
补充
你现在在 [Test_01.java](/Workbench-System/src/test/java/com/fuyo/dic/workbench/system/Test_01.java) 里加的这个:
@SpringBootConfiguration
static class TestApplication {
}
本质上是在告诉 `@SpringBootTest`:
- “别再往外找了,就用我这个最小启动配置类”
再补一个关键点
- 这里不一定非得写 `@SpringBootConfiguration`
- 也可以直接写一个独立启动类,然后:
@SpringBootTest(classes = XxxTestApplication.class)
或者直接复用已有 `@SpringBootApplication`
- 只是对你这个 `Test_01` 来说,补一个最小 `@SpringBootConfiguration` 最轻量,不会把整套业务 Bean 都拉起来。
建议
- 如果这个测试只是验证普通 Java 逻辑,其实最好不要用 `@SpringBootTest`
- 如果它确实要测 Spring 容器行为,再保留现在这种写法最合适