You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot@Test方法禁用RabbitMQ连接失败,求可行方案

如何在@Test方法中禁用RabbitMQ并阻止连接建立

我希望在@Test方法中禁用RabbitMQ,尝试使用doNothing.when(rabbit.class)方法,但并未生效。能否帮忙找到阻止RabbitMQ建立连接的方法?

错误日志

2023-02-06 19:39:58.519  INFO 75 --- [ntContainer#0-1] o.s.a.r.c.CachingConnectionFactory       : Attempting to connect to: localhost:5672
2023-02-06 19:39:58.522 ERROR 75 --- [ntContainer#0-1] o.s.a.r.l.SimpleMessageListenerContainer : Failed to check/redeclare auto-delete queue(s).

org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused
    at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:61) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:602) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:725) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.connection.ConnectionFactoryUtils.createConnection(ConnectionFactoryUtils.java:252) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:2180) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2153) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:2133) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueInfo(RabbitAdmin.java:463) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.core.RabbitAdmin.getQueueProperties(RabbitAdmin.java:447) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.attemptDeclarations(AbstractMessageListenerContainer.java:1930) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.redeclareElementsIfNecessary(AbstractMessageListenerContainer.java:1911) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.initialize(SimpleMessageListenerContainer.java:1377) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1223) ~[spring-rabbit-2.4.7.jar:2.4.7]
    at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
Caused by: java.net.ConnectException: Connection refused

解决方法

1. 使用@MockBean替换RabbitMQ相关Bean

直接用@MockBean注解替换应用中用到的RabbitMQ核心Bean,Spring容器会使用模拟对象替代真实实例,避免初始化连接:

@SpringBootTest
public class YourTestClass {
    @MockBean
    private RabbitTemplate rabbitTemplate;
    
    @MockBean
    private SimpleMessageListenerContainer messageListenerContainer;
    
    @MockBean
    private RabbitAdmin rabbitAdmin;
    
    @Test
    void yourTestMethod() {
        // 编写测试逻辑
    }
}

2. 配置测试专用的RabbitMQ参数

在src/test/resources下创建application.properties或application.yml,通过配置禁用自动配置或设置无效连接参数:

  • 完全禁用RabbitMQ自动配置:
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
  • 设置无效连接参数(适合无需完全禁用自动配置的场景):
spring.rabbitmq.host=invalid-host
spring.rabbitmq.port=0

3. 排除RabbitMQ自动配置启动测试

结合@SpringBootTest和@EnableAutoConfiguration注解,直接排除RabbitMQ的自动配置类:

@SpringBootTest
@EnableAutoConfiguration(exclude = RabbitAutoConfiguration.class)
public class YourTestClass {
    @Test
    void yourTestMethod() {
        // 编写测试逻辑
    }
}

4. 手动模拟ConnectionFactory

如果需要更细粒度的控制,可以手动模拟连接工厂,让它返回模拟的连接和通道,彻底避免真实连接尝试:

@SpringBootTest
public class YourTestClass {

    @TestConfiguration
    static class TestRabbitConfig {
        @Bean
        public ConnectionFactory connectionFactory() {
            ConnectionFactory mockConnFactory = Mockito.mock(ConnectionFactory.class);
            try {
                Connection mockConn = Mockito.mock(Connection.class);
                Channel mockChannel = Mockito.mock(Channel.class);
                Mockito.when(mockConnFactory.createConnection()).thenReturn(mockConn);
                Mockito.when(mockConn.createChannel(false)).thenReturn(mockChannel);
            } catch (IOException e) {
                // 忽略异常或按需处理
            }
            return mockConnFactory;
        }
    }

    @Test
    void yourTestMethod() {
        // 编写测试逻辑
    }
}

内容的提问来源于stack exchange,提问作者DevMateus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:50:19