SpringBootTest和SpringBootApplication

1、SpringBootTest 注解的作用与使用

SpringBootTest 注解概述

@SpringBootTest 是一个 Spring Boot 提供的测试注解,用于启动一个完整的 Spring 应用上下文,并运行集成测试。它的作用主要体现在以下几个方面:

  • 启动 Spring 容器@SpringBootTest 会自动启动一个完整的 Spring 容器。适用于测试场景中需要访问 Spring Bean、数据库等资源的情况。

  • 集成测试 :它不仅是单元测试的工具,还支持集成测试,尤其是涉及到应用的多层级交互(如服务层、数据层等)时,@SpringBootTest 可以确保整个应用在测试环境中能被完整加载。

没有 @SpringBootTest 注解时的问题

在没有使用 @SpringBootTest 注解时,Spring Boot 应用的上下文不会被自动加载,这会导致一些依赖注入(如服务、数据源等)没有正确创建或注入,最终导致单元测试无法正确运行。

常见的使用场景

  1. 集成测试:通过启动 Spring Boot 的应用上下文,可以验证不同组件之间的协作。

  2. Web 测试 :通过 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 可以启动嵌入式的 Web 环境,用于模拟 HTTP 请求,测试 Web 层的交互。

  3. 与数据库交互的测试:测试时可以模拟与数据库的交互,确保持久化层操作能够正确运行。

示例代码

java 复制代码
@SpringBootTest
public class TestPerson {

    @Autowired
    private TxPersonMapper txPersonMapper;

    @Autowired
    private ApplicationContext context;

    @Test
    public void contextLoads(){
        DataSource dataSource = (DataSource) context.getBean("dataSource");
        System.out.println(dataSource);
    }

2、@SpringBootApplication 注解的作用

SpringBootApplication 注解概述

@SpringBootApplication 是一个组合注解,等同于以下三个注解的组合:

  • @SpringBootConfiguration:标记当前类为 Spring Boot 的配置类,相当于 @Configuration 注解。

  • @EnableAutoConfiguration:开启 Spring Boot 自动配置功能,帮助自动配置应用所需的各种默认配置。

  • @ComponentScan:启用组件扫描,扫描当前包及其子包下的所有组件(如 @Component, @Service, @Repository 等)。

@SpringBootApplication 标记的类通常是 Spring Boot 应用的启动入口。

常见的使用场景

  • 启动类@SpringBootApplication 通常用于 Spring Boot 应用的启动类,启动类中包含 public static void main(String[] args) 方法,作为应用的入口。

  • 自动配置:它使得 Spring Boot 可以自动配置你所需的默认配置,减少了手动配置的复杂度。

示例代码

java 复制代码
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3、包结构与项目启动问题

包结构的影响

Spring Boot 项目默认情况下,会从启动类所在的包及其子包开始进行组件扫描。如果测试类不在启动类所在的包及其子包下,可能会导致以下问题:

  1. 组件扫描不到:Spring Boot 会根据启动类的包进行组件扫描。如果测试类所在的包不在启动类的同级或子级目录下,Spring Boot 可能找不到所需的组件,导致应用启动失败或测试无法运行。

  2. 配置无法加载 :如果 @SpringBootApplication 注解的启动类与测试类不在相同的包结构内,可能会影响配置加载的正确性,导致缺少配置或无法找到必要的 Bean。

如何解决

  1. 确保测试类在正确的包结构下:通常建议将测试类放在与启动类相同的包或子包中,确保 Spring 能够扫描到所需的 Bean。

  2. 使用 @ComponentScan 指定扫描路径 :如果确实有需要将测试类和启动类分离,可以通过 @ComponentScan 显式指定扫描路径,使其能够扫描到正确的组件。

示例代码

假设启动类在 com.example.demo 包下,测试类如果在 com.example 包下就可能找不到启动类所配置的 Bean。解决方案是:

java 复制代码
@SpringBootTest
@ComponentScan(basePackages = "com.example.demo")
public class MyServiceTest {
    // 测试代码
}

4、总结

@SpringBootTest 与 @SpringBootApplication 关系总结

  • @SpringBootTest 用于单元测试,自动加载 Spring 上下文,适用于集成测试。

  • @SpringBootApplication 是 Spring Boot 启动类的注解,包含了应用配置、自动配置和组件扫描功能,通常用于应用启动入口类。

包结构的重要性

  • Spring Boot 会从启动类所在的包开始自动扫描组件和配置。如果测试类不在合适的包路径下,可能会导致启动失败或组件注入问题。

  • 保持启动类和测试类在相同或相邻的包结构中,可以避免这类问题。

相关推荐
文慧的科技江湖1 天前
一文读懂光伏、储能,充电工作原理,是如何实现闭环的,其中微电网(ems)是什么;这个内容,就看懂了源网荷储。十五五规划里面最核心的能源管理内容
开源·springboot·储能·光伏
AI人工智能+电脑小能手1 天前
【大白话说Java面试题 第163题】【06_Spring篇】第23题:说说SpringBoot 自动配置原理?
java·自动配置·springboot·spi·条件注解
AI人工智能+电脑小能手1 天前
【大白话说Java面试题 第164题】【06_Spring篇】第24题:如何理解 SpringBoot 的 Starter?
java·自动配置·springboot·starter·自定义组件
极光代码工作室1 天前
基于SpringBoot的订单管理系统
java·springboot·web开发·后端开发
衍生星球4 天前
SpringBoot3 + Vue3 + 微信小程序如何学习,以及学哪些技术,组件
sql·微信小程序·uni-app·vue·springboot
她说..5 天前
Java 默认值设置方式
java·开发语言·后端·springboot
折哥的程序人生 · 物流技术专研6 天前
Java面试通关⑨:SpringBoot核心全集
自动配置·springboot·starter·校招·java面试·面试真题·内嵌容器
ShiXZ2137 天前
PDF-OCR文件识别篇(八):配置、运维与排错
java·运维·ocr·dubbo·springboot
ShiXZ2137 天前
PDF-OCR文件识别篇(七):数据入库
java·pdf·json·ocr·springboot
带刺的坐椅14 天前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon