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();
}