如何在SpringBoot测试中禁用RabbitMQ

4ioopgfo  于 2023-02-04  发布在  Spring
关注(0)|答案(1)|浏览(467)

我有一个Spring Boot测试

@ExtendWith(SpringExtension.class)
@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
        classes = {PDFService.class},
        properties = {
                "spring.cloud.config.enabled=false",
                "spring.cloud.discovery.enabled=false",
        })
@EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class})
class PDFServiceTest {

一开始我就遇到了这个异常

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
    No qualifying bean of type 'org.springframework.amqp.rabbit.core.RabbitTemplate' available: 
    expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

我如何在测试中禁用RabbitMQ?或者嘲笑它。

myzjeezk

myzjeezk1#

看起来RabbitMQ被禁用了,这实际上是你得到异常的原因。你的代码包含一个bean,它在测试设置中被加载(并自动连接),看起来像这样:

@Component
public class MyMessageManager {
   @Autowired
   private RabbitTemplate rabbitTemplate;

   public void doSomething() {
      ....
      rabbitTemplate.<...> // use the template 
   }
}

当spring test创建这个bean的示例时,它应该能够注入一些看起来像rabbit模板的东西,但是因为你已经禁用了它--没有bean要注入,所以出现了这个错误。
怎么解决呢?嗯,有很多不同的方法:
1.在测试中使用@MockBean

@ExtendWith(SpringExtension.class)
@SpringBootTest(
        webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT,
        classes = {PDFService.class},
        properties = {
                "spring.cloud.config.enabled=false",
                "spring.cloud.discovery.enabled=false",
        })
@EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class})
class PDFServiceTest {
   ...
   @MockBean RabbitTemplate template;

现在,rabbit模板的模拟将被注入到所有需要它的bean中。
1.重构代码,使使用RabbitTemplate的类不会被加载。通常,如果你不想测试该类的功能,这样做效果很好。
1.不要禁用Rabbit MQ,而是尝试使用测试容器并在测试之前启动Rabbit mq,创建一个infra来定义运行代码所需的一切,并注入一个真实的的Rabbit模板,该模板可以与Rabbit的测试容器一起工作。

相关问题