有些文章介绍了如何测试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)
。
我做错了吗?创建与代理的真实连接以及从测试发送消息需要什么?
答案 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 {