当前位置: 首页 > 知识库问答 >
问题:

如果在测试时在IntegrationFlow中使用模拟处理程序,则无法从输出通道接收消息

严烨
2023-03-14

用于测试以下IntegrationFlow

IntegrationFlows.from("channel.input")
            .enrich(m -> m.header(MessageHeaders.ERROR_CHANNEL, "channel.input.error"))
            .handle("handler", "handle")
            .channel("channel.output")
            .get();

我写了一个配置类:

@Configuration
@ComponentScan
@EnableIntegration
public class ServiceFlowContext {

    @Bean(name = "handler")
    public Handler handler() {
        return Mockito.mock(Handler.class);
    }

    @Bean("channel.output")
    public QueueChannel outputChannel() {
        return new QueueChannel();
    }
}

和一个测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@DirtiesContext
@ContextConfiguration(classes = ServiceFlowContext.class)
public class ServiceFlowTest {
    @Autowired
    private Handler handler;

    @Autowired
    @Qualifier("channel.input")
    private MessageChannel inputChannel;

    @Autowired
    @Qualifier("channel.output")
    private QueueChannel outputChannel;

    @Test
    public void shouldGetMessageInErrorChannelIfHandlerFailed() {
        Message<String> message = MessageBuilder.withPayload("empty").build();
        when(handler.handle(message)).thenReturn(message);
        inputChannel.send(message);

        Message result = outputChannel.receive(5000);
        assertThat(result).isNotNull();
    }
}

测试将在接收方法处等待5秒,我将得到一个导致测试失败的空对象。但是,如果我定义一个真实对象而不是模拟对象,就像:

public static class Handler1 {
    public Message<String> handle(Message<String> message) {
        return message;
    }
}

@Bean(name = "handler")
public Handler1 handler() {
    return new Handler1();
}

然后,我可以从频道接收消息。输出通道(outputChannel),与发送的内容相同。在测试中使用模拟处理程序有什么解决方案吗?

共有1个答案

邵捷
2023-03-14

您需要存根handle()方法。

类似于:

Handler handler = Mockito.mock(Handler.class);
BDDMockito.willAnswer(invocation -> invocation.getArgument(0))
    .given(handler).handle(any());
return handler;

这将与您的手柄1相同。handle()。

 类似资料:
  • ListView是从后台线程加载的,该线程从SQLite数据库调用get值并将它们加载到ArrayList中。这个显示结果的线程调用一个CustomHandler,但它不接收来自线程的消息。 下面是一个示例代码: 处理线程线程; 我不明白为什么我的处理程序不在Log. i()中显示文本 这里是我的完整代码: 第一部分: 第2部分: 如果处理程序没有收到消息,我无法显示我的listView。 我通过

  • 示例响应处理程序: 我们如何通过模拟处理程序中的对象来对上述处理程序进行单元测试?

  • 我们正在开发一款Twilio可编程语音应用程序,可以从人员列表中进行选择,并向他们的常规电话号码拨打出站电话。 一旦通话接通,我们希望能够与对方通话,然后从通话接收方收集dtmf输入,以便根据输入的dtmf代码触发特定的TwiML代码。 Twilio可编程语音文档没有指定如何在出站通话中收集来自通话接收者的dtmf输入,但我认为这在某种程度上是可能的。任何建议或想法都将不胜感激!

  • 问题内容: 我已经在现有应用中配置了GCM,并且在那里收到了通知。现在我面临两个问题:1)我退出应用程序时未收到通知,或者应用程序在后台。2)我没有在iPhone的通知区域中收到通知,仅当我的应用程序正在运行时,我才直接在该区域接收警报消息。当我下拉通知区域时,我在xcode的控制台中收到此消息 “无法连接到GCM:操作无法完成。(com.google.gcm错误2001。)” 我的PHP文件在下

  • 我正在使用Sagemaker训练一个模型,特别是DeepAR图像,并将训练集和测试集作为功能的输入。示例代码: 我在培训结束时看到了一些测试结果指标,但我想得到实际的预测来进行分析。测试结果指标示例: 我发现最好的方法是根本不上传测试集,而是单独运行作业来获取测试预测。关于估计器,文档含糊其辞: S3保存训练结果的位置(模型工件和输出文件) 不知道其中包括什么。有没有办法得到测试集的预测?提前谢谢

  • 我正在处理FCM通知。当应用程序在后台时,我的通知工作正常,但当应用程序在前台时,我的通知无法接收。我几乎什么都试过了,但都不奏效。当应用程序处于前台时,不会收到通知。 manifest.xml: 代码(FirebaseMessagingService):