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

Spring 测试时,如果在IntegrationFlow中使用模拟处理程序,则无法从输出通道接收消息,spring,spring-integration,spring-test,spring-integration-dsl,Spring,Spring Integration,Spring Test,Spring Integration Dsl,用于测试以下集成流: 我编写了一个配置类: @Configuration @ComponentScan @EnableIntegration public class ServiceFlowContext { @Bean(name = "handler") public Handler handler() { return Mockito.mock(Handler.class); } @Bean("channel.output") pu

用于测试以下集成流:

我编写了一个配置类:

@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();
    }
}
测试将在receive方法处等待5秒钟,我将得到一个导致测试失败的空对象。但是,如果我定义一个真实对象而不是模拟对象,就像:

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

@Bean(name = "handler")
public Handler1 handler() {
    return new Handler1();
}
然后,我可以从channel.output channel outputChannel接收消息,与发送的消息相同。在测试中是否有使用模拟处理程序的解决方案?

您需要存根handle方法

比如:

Handler=Mockito.mockHandler.class; BDDMockito.willAnswerinvocation->invocation.getArgument0 .givenhandler.handleany; 返回处理程序;
这和你的手柄一样。手柄。

非常感谢,它很管用。但是我可以知道更多的信息吗。关于这个案子?我发现,在我的例子中,doAnswer和return应该是一样的,只是语法上的糖读。有些人更喜欢行为驱动的开发风格,更喜欢给定的。。。结束时…然后返回。。。并将回答…给定。。。在doAnswer上空…当…那很奇怪。我得到了whenhandler.handlemessage.thenReturnmessage;在测试方法中,但它根本不起作用。我建议您编辑您的问题以显示完整的测试用例;更好的是,问一个新问题,但你必须展示一切。恐怕我已经把所有与考试相关的东西都放在了我的问题中。您可以在名为shouldGetMessageInErrorChannelIfHandlerFailed的测试方法的第二行中看到whenhandler.handlemessage.thenReturnmessage的代码。如果和willAnswer一样…给定…,为什么我不能从outputChannel获取消息?
public static class Handler1 {
    public Message<String> handle(Message<String> message) {
        return message;
    }
}

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