Spring Boot 单元测试按需加载

在 Spring Boot 单元测试中,可以通过使用 @MockBean或者自定义配置来实现按需加载Bean,避免加载不必要的组件。

比如在测试 TopicProducer 类时,

而在 TopicConsumer 类中的一些配置会影响到测试的进行,需要排除。

方法一:使用@MockBean忽略不需要的Bean

java 复制代码
package com.taj.rabbit.exchange.topic;

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.bean.override.mockito.MockitoBean;

@SpringBootTest
class TopicProducerTest {

    @Resource
    TopicProducer topicProducer;

    // 使用 @MockitoBean 来替代真实的 Bean,以达到禁用加载的目的
    @MockitoBean(name = "topicConsumer")
    TopicConsumer topicConsumer;

    @Test
    void init() {
        topicProducer.init();
    }

    @Test
    void send() {
        topicProducer.send();
    }
}

方法二:使用classes属性指定加载类

上面的注解 @SpringBootTest 无参,默认会寻找应用启动类

即等价于 @SpringBootTest(classes = RabbitApplication.class)

其中 RabbitApplication.class 就是应用启动类:

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

这种方式会加载完整的Spring Boot应用程序上下文:

  1. 真实环境模拟:更接近实际运行环境,会初始化所有配置、数据库连接、外部服务等
  2. 启动时间较长:因为要加载整个应用上下文,所以测试启动较慢

如果只想加载一个多或多个类,可以直接写在 classes 参数中,如下:

java 复制代码
package com.taj.rabbit.exchange.topic;

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest(classes = TopicProducer.class)
@EnableAutoConfiguration // 开启自动配置功能,测试连接 rabbitmq
class TopicProducerTest {

    @Resource
    TopicProducer topicProducer;

    @Test
    void init() {
        topicProducer.init();
    }

    @Test
    void send() {
        topicProducer.send();
    }
}

如果测试需要连接真实的 rabbitmq,数据库等,则开启自动配置功能。

如果 application.yaml 配置文件很大,会启用很多自动配置,而我只需要启用 rabbit

可以修改如下:

java 复制代码
package com.taj.rabbit.object2json;

import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

import java.util.Map;

//@SpringBootTest(classes = {ObjectPublisher.class, RabbitConfig.class})
//更轻量的一种方式:
@SpringJUnitConfig(classes = {ObjectPublisher.class, RabbitConfig.class})
//@TestPropertySource(locations = "classpath:rabbit.properties")
@TestPropertySource(
        properties = {
                "spring.application.name=rabbit",
                "spring.rabbitmq.addresses=192.168.2.11:5672",
                "spring.rabbitmq.username=admin",
                "spring.rabbitmq.password=admin123",
                "spring.rabbitmq.virtual-host=/",
                "spring.rabbitmq.listener.simple.prefetch=1"
        }
)
@EnableAutoConfiguration
class ObjectPublisherTest {

    @Resource
    private ObjectPublisher objectPublisher;

    @Test
    void send() {
        // 测试:发送 Object 消息
        Map<String, Object> message = Map.of("name", "Taj", "age", 18);
        System.out.println("[发送1个消息给队列 " + RabbitConfig.QUEUE_NAME + "]");
        objectPublisher.send(message);
    }
}
相关推荐
专业程序开发源14 分钟前
django便利店外卖后台管理系统19650-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
马剑威(威哥爱编程)27 分钟前
【AI全栈后端12-09】Spring Boot 用流式输出做打字机对话:点下去不再干等
java·人工智能·spring boot·后端
wno70432 分钟前
Spring Boot整合Flyway
java·spring boot·后端
vx_Biye_Design37 分钟前
springboot旅游管理系统18006-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·django·课程设计
IT_陈寒1 小时前
为什么我的React组件一直在意外重渲染?
前端·人工智能·后端
EatFan1 小时前
2026 Rust 后端技术栈选型:Axum 0.8 + Tokio + SQLx 全链路怎么搭
开发语言·后端·rust·tokio·serde·axum·sqlx
mldong1 小时前
审批详情页高亮的那个节点,"名字"其实是一串 id:jeeflow 工作流引擎的四块数据来源
后端·架构
高频因子挖掘机1 小时前
股票历史数据缺了一天怎么发现?用 Pandas 检查交易日期连续性
后端·github·api
高频因子挖掘机1 小时前
量化回测最危险的错误,不是程序报错,而是数据错了却正常运行
后端·github·api
云浪2 小时前
Go 堆实战:从完全二叉树到 Top-K 与任务调度
后端·go