我尝试了一些spring-cloud-stream的东西。一切正常,现在我试着写一些测试用例。不幸的是他们没有工作。我将所有内容减少到以下内容(一切都在同一个启动应用程序中):
发件人:
@EnableBinding(Sender.Emitter.class)
public class Sender {
public interface Emitter {
String CHANNEL = "emitter";
@Output(CHANNEL)
MessageChannel events();
}
private Emitter emitter;
public Sender(Emitter emitter) {
this.emitter = emitter;
}
public void sendMessage(String massage) {
emitter.events().send(MessageBuilder.withPayload(massage).build());
}
}
接收者:
@EnableBinding(Receiver.Subscriber.class)
public class Receiver {
public interface Subscriber {
String CHANNEL = "subscriber";
@Input(CHANNEL)
SubscribableChannel events();
}
private String lastMessage;
public String getLastMessage() {
return lastMessage;
}
@StreamListener(Subscriber.CHANNEL)
public void event(String message) {
this.lastMessage = message;
}
}
我的配置:
spring:
cloud:
stream:
default-binder: rabbit
bindings:
emitter:
destination: testtock
content-type: application/json
subscriber:
destination: testtock
测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class BasicTest {
@Autowired
private Receiver receiver;
@Autowired
private Sender sender;
@Test
public void test() throws InterruptedException {
String massage = UUID.randomUUID().toString();
sender.sendMessage(massage);
//Thread.sleep(1000);
assertEquals(massage, receiver.getLastMessage());
}
}
我希望使用spring-cloud-stream-test-support
进行测试,以便不需要AMQP消息代理。在测试之外,我使用了rabbitmq,一切正常。
也许spring-cloud-stream-test-support
并没有真正路由消息?或者这里有什么问题?
答案 0 :(得分:1)
也许spring-cloud-stream-test-support不能真正路由消息?
正确;测试活页夹只是一个安全带,它不会在绑定之间路由;在同一个应用程序中为同一目的地设置生产者和消费者绑定是不寻常的。
在测试中发送消息时,您必须查询绑定器以确保它是预期发送的。您使用MessageCollector
来执行此操作。请参阅the documentation,您还可以查看部分out of the box apps的测试。
答案 1 :(得分:0)
spring-cloud-stream-test-support
提供了测试单个Spring Cloud Stream应用程序并使用TestSupportBinder
的功能。因此,这不适用于您正在使用的端到端集成测试。
有关使用spring-cloud-stream-test-support
和TestSupportBinder
的详细信息,请参阅文档here