不灭的焱

革命尚未成功,同志仍须努力 下载Java21

作者:AlbertWen  添加时间:2026-06-13 22:51:32  修改时间:2026-06-22 07:35:10  分类:07.Java框架/系统  编辑

如下所示的一个@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 容器行为,再保留现在这种写法最合适