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
相关产品推荐
相关产品推荐

