【问题标题】:How to get channel in TestSupportBinder without using Transformer如何在不使用 Transformer 的情况下在 TestSupportBinder 中获取频道
【发布时间】:2017-04-17 08:51:59
【问题描述】:

我正在尝试使用 TestSupportBinder 为 Spring Cloud Stream 应用程序编写测试。我发现的所有示例,包括official documentsofficial github,都是用Transformer 测试Processor。这些测试使用Tranformer 获取输出Channel,并将Channel 对象输入messageCollector.forChannel 方法以轮询输出。

但是,我没有使用提供的Processer,而是编写了自己的接口。我找不到在测试代码中获取所需 Channel 对象的方法。我曾尝试将我的接口自动连接到测试类以获取 Channel 对象,但以 java.lang.IllegalArgumentException: Channel [MY_CHANNEL] was not bound by class org.springframework.cloud.stream.test.binder.TestSupportBinder 结束。

【问题讨论】:

    标签: spring-cloud-stream


    【解决方案1】:

    错误消息表示频道MY_CHANNEL 未注册到MessageCollector。并且,这表明您的接口中的频道MY_CHANNEL 未在您的应用程序中使用EnableBinding 声明。您的应用程序中是否有@EnableBinding(MyOwnInterface.class)(MyOwnInterface 声明了MY_CHANNEL 通道)?

    【讨论】:

    • 感谢您的回答。我的应用程序代码可在 [another post](stackoverflow.com/questions/43446135/…) 中找到。我的测试代码是验证提交的请求是否会在“已批准”频道中收到一条消息。所以,MY_CHANNEL 实际上是“已批准”的频道。
    • 我发现messageCollector. forChannel 方法接受MessageChannel 但不接受SubscribableChannel。将 SubscribableChannel 传递给 messageCollector. forChannel 会导致异常。
    • 除上述情况外,您无法使用 TestSupportBinder 注册标记为 @Input 的频道。只有标记为@Output 的通道才能工作,并且它们必须是绑定接口中的MessageChannel 类型。
    【解决方案2】:

    查看 spring 文档here 后,我注意到他们似乎有意只跟踪输出通道,而不是输入通道。

    例如,参见:

    对于出站消息通道,TestSupportBinder 注册一个 单个订阅者并保留应用程序发出的消息 在消息收集器中。它们可以在测试期间检索并具有 针对他们的断言。

    另外,在示例中,他们只是在输出通道上演示:

    messageCollector.forChannel(processor.output()).poll()
    

    在我看来,他们希望您通过调用监听方法来跟踪您的输入通道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-19
      • 2017-06-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多