Spring integration 测试多个spring云流应用程序的问题

Spring integration 测试多个spring云流应用程序的问题,spring-integration,spring-test,spring-cloud-stream,Spring Integration,Spring Test,Spring Cloud Stream,场景:我有3个spring云流应用程序 1'st:将XML负载解组到JAXB对象中 第2步:将JAXB负载转换为我们的域POJO 第3步:验证域对象 我正在尝试测试第三个应用程序。我将第一个和第二个应用程序作为测试依赖项包括在内。我补充说: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-

场景:我有3个spring云流应用程序

  • 1'st:将XML负载解组到JAXB对象中
  • 第2步:将JAXB负载转换为我们的域POJO
  • 第3步:验证域对象
我正在尝试测试第三个应用程序。我将第一个和第二个应用程序作为测试依赖项包括在内。我补充说:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-stream-test-support</artifactId>
        <scope>test</scope>
    </dependency>

org.springframework.cloud
spring云流测试支持
测试
现在我有大约20个xml文件和各种验证场景。第一个测试运行良好。我能够通过以下方式获取频道的预期消息:

    final Message<PaymentInstruction> mceMessage =
            (Message<PaymentInstruction>) collector.forChannel(
                    validationBindings.mce()).take();
最终消息mceMessage=
(消息)collector.forChannel(
validationBindings.mce()).take();
运行的第2个测试是我遇到问题的地方。这项考试只考“take”

我在spring-integration-core-4.3.8.jar中做了一些挖掘,并将问题追溯到org.springframework.integration.dispatcher.AbstractDispatcher:

@Override
public synchronized boolean addHandler(MessageHandler handler) {
    Assert.notNull(handler, "handler must not be null");
    Assert.isTrue(this.handlers.size() < this.maxSubscribers, "Maximum subscribers exceeded");
    boolean added = this.handlers.add(handler);
    if (this.handlers.size() == 1) {
        this.theOneHandler = handler;
    }
    else {
        this.theOneHandler = null;
    }
    return added;
}
@覆盖
公共同步布尔addHandler(MessageHandler处理程序){
notNull(处理程序,“处理程序不得为null”);
Assert.isTrue(this.handlers.size();
boolean added=this.handlers.add(handler);
if(this.handlers.size()==1){
this.theOneHandler=handler;
}
否则{
this.theOneHandler=null;
}
增加了退货;
}
有一个为第一个测试添加的处理程序,因此它将null分配给“this.theOneHandler”

我的选择是:

  • 重构其他两个项目中的代码,这样我就可以在不需要SpringCloud应用程序代码的情况下进行域对象的解组和创建
  • 我可以为每个测试用例创建一个单独的单元测试类,但是我不想走这条路,因为spring boot的启动时间很长,会乘以测试用例的数量
  • 我是否缺少一些允许我拥有这些多个处理程序的配置,或者我打破了我想要使用SpringCloud流的方式
环境:

  • Java8更新131
  • org.springframework.cloud:springcloud依赖项:Dalston.RELEASE
  • org.springframework.boot:springboot依赖项:1.5.2.RELEASE

当一个频道只有一个订户时,ONEHADLER
是一种调度优化

听起来好像您正在将所有服务绑定到同一个频道,这不是您想要的

归根结底,您无法执行您试图执行的操作,因为每个服务都使用相同的频道名称(可能是
input

您需要在单独的应用程序上下文中加载每个服务,并使用网桥将它们连接在一起

编辑


您还可以使用一个测试来测试它们。

当一个频道只有一个订户时,ONEHADLER
是一种调度优化

听起来好像您正在将所有服务绑定到同一个频道,这不是您想要的

归根结底,您无法执行您试图执行的操作,因为每个服务都使用相同的频道名称(可能是
input

您需要在单独的应用程序上下文中加载每个服务,并使用网桥将它们连接在一起

编辑


您还可以使用。

测试它们。您还可以使用聚合应用程序将它们连接在一起。您还可以使用聚合应用程序将它们连接在一起。