使用来自测试的Spring云流连接到消息代理

时间:2018-04-13 11:33:47

标签: java spring-boot rabbitmq spring-cloud-stream

有些文章介绍了如何测试Spring云流应用程序,而无需连接到具有spring-cloud-stream-test-support的消息系统。但我想从我的集成测试中真正连接到RabbitMQ,并且不能这样做。这是测试类:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@EnableBinding(Source.class)
public class StreamIT {

  @Autowired
  private Source source;

  @Test
  public void testMessageSending() throws InterruptedException {
    source.output().send(MessageBuilder.withPayload("test").build());
    System.out.println("Message sent.");
  }

}

一切都与@SpringBootApplication相同,它们使用application.yml中的相同属性。

但是没有发送消息的日志行(o.s.a.r.c.CachingConnectionFactory : Created new connection: SpringAMQP#22e79d25:0/SimpleConnection@5cce3ab6 [delegate=amqp://guest@127.0.1.1:5672/, localPort= 60934] ), 即使代理未启动,也没有java.net.ConnectException: Connection refused (Connection refused)

我做错了吗?创建与代理的真实连接以及从测试发送消息需要什么?

2 个答案:

答案 0 :(得分:1)

修改

您需要从pom中移除测试支持jar。它的存在(在测试范围内)是触发用测试粘合剂替换真实粘合剂的原因。

取下测试活页夹支架后,这对我来说很好......

@RunWith(SpringRunner.class)
@SpringBootTest
public class So49816044ApplicationTests {

    @Autowired
    private Source source;

    @Autowired
    private AmqpAdmin admin;

    @Autowired
    private RabbitTemplate template;

    @Test
    public void test() {
        // bind an autodelete queue to the destination exchange
        Queue queue = this.admin.declareQueue();
        this.admin.declareBinding(new Binding(queue.getName(), DestinationType.QUEUE, "mydest", "#", null));

        this.source.output().send(new GenericMessage<>("foo"));

        this.template.setReceiveTimeout(10_000);
        Message received = template.receive(queue.getName());
        assertThat(received.getBody()).isEqualTo("foo".getBytes());
    }

}

虽然没有兔子样本;有一个kafka sample that uses a real (embedded) kafka binder for testing,虽然排除了测试罐,但它没有明确说明需要。

答案 1 :(得分:1)

由于您在测试中使用了@SpringBootTest注释,因此Spring Boot将评估所有可用的自动配置。

如果您在测试类路径中具有spring-cloud-stream-test-support依赖性,那么还将评估以下自动配置:

  • org.springframework.cloud.stream.test.binder.TestSupportBinderAutoConfiguration
  • org.springframework.cloud.stream.test.binder.MessageCollectorAutoConfiguration

因此,应用程序上下文中只有一个活页夹-org.springframework.cloud.stream.test.binder.TestSupportBinder。用它的名字,您可以理解它对真正的绑定没有任何作用。

从测试类路径中排除/删除spring-cloud-stream-test-support依赖性-是一种可疑的解决方案。由于它会迫使您为单元测试和集成测试创建两个单独的模块。

如果要在测试中排除前面提到的自动配置。您可以按照以下步骤进行操作:

@RunWith(SpringRunner.class)
@SpringBootTest
@EnableAutoConfiguration(exclude = {TestSupportBinderAutoConfiguration.class, MessageCollectorAutoConfiguration.class})
public class StreamIT {