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);
    }
}
相关推荐
AlienZHOU4 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
李昊哲小课6 小时前
Spring Boot SSE 实时推送教程
spring boot·websocket·flux·sseemitter
狗头大军之江苏分军6 小时前
《潮水漫过十七岁》开学了
后端
苏三说技术7 小时前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong7 小时前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno7047 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
Captaincc7 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
aramae8 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
行百里er9 小时前
Spring Insight 里如何把 Span 收成一条链路
spring boot·spring cloud·监控
IT_陈寒9 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端