发布测试多个Spring云流应用程序

时间:2017-04-21 05:27:46

标签: spring-integration spring-test spring-cloud-stream

场景:我有3个春天云流媒体应用

  • 1' st:将XML有效负载解组为JAXB对象
  • 2' nd:将JAXB有效负载转换为我们的域POJO
  • 3' rd:验证域对象

我正在尝试测试3&#tdd应用。我已将1&2;和2&ndd应用程序作为测试依赖项包含在内。我添加了:

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

现在我有大约20个带有各种验证方案的xml文件。第一次测试工作正常。我可以使用以下方式获取频道的预期消息:

    final Message<PaymentInstruction> mceMessage =
            (Message<PaymentInstruction>) collector.forChannel(
                    validationBindings.mce()).take();

运行的2&nd测试是我遇到问题的地方。测试只是坐在&#39; take&#39;。

我在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;
}

为第一次测试添加了一个处理程序,因此它将“null”分配给“theOneHandler”

我的选择是:

  • 重构其他2个项目中的代码,以便我可以在不需要spring cloud应用程序代码的情况下进行域名对象的解组和创建
  • 我可以为每个测试用例创建一个单独的单元测试类,但是我不想走这条路,因为spring boot的启动时间会很高,会乘以测试用例的数量
  • 我是否有一些丢失的配置可以让我拥有这些多个处理程序,或者我是否打破了我想要使用Spring云流的方式?

环境:

  • Java 8 Update 131
  • org.springframework.cloud:spring-cloud-dependencies:Dalston.RELEASE
  • org.springframework.boot:弹簧引导的依赖关系:1.5.2.RELEASE

1 个答案:

答案 0 :(得分:0)

theOneHandler是在频道只有一个订阅者时使用的调度优化。

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

底线是你无法做你想做的事情,因为每个服务都使用相同的频道名称(大概是input)。

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

编辑

您也可以使用aggregated application测试它们。