模拟JMS MessageSource

时间:2017-07-28 12:09:24

标签: java spring jms mockito spring-integration

我有一组MessageSource s(实际上是JmsDestinationPollingSource s),它们会定期轮询。这是一个持久化队列项的Oracle AQ数据库。

@Bean
@InboundChannelAdapter(value = "queueSourceChannel", poller = @Poller(fixedDelay = "1000"))
public MessageSource queueSource() {
    return Jms
            .inboundAdapter(connectionFactory)
            .configureJmsTemplate(t -> t.deliveryPersistent(true)
                            .jmsMessageConverter(jacksonJmsMessageConverter)
            ).destination(queueName).get();
}

但是,现在,我想在没有Oracle持久性的情况下制作@SpringBootTest

我现在这样做的方式是通过模仿(Mockito)上面的Bean:

@MockBean(name = "queueSource")
private MessageSource queueSource;

这样,可以运行测试类,而不必担心会对MessageSource进行轮询。

但是,正如我所提到的,我有多个MessageSource,并且我想以另一种方式禁用此轮询。

我现在这样做的方式很愚蠢:

@MockBean(name = "queueSource")
private MessageSource queueSource;

@MockBean(name = "queueSource2")
private MessageSource queueSource2;

@MockBean(name = "queueSource3")
private MessageSource queueSource3;

.. and so on

我试图模拟所有的MessageSources,或者所有的JmsDestinationPollingSource,但这看起来很难(我读过有关PowerMockito的内容,但还没有尝试过,因为我认为可以采取不同的方式)。

我认为也应该可以在测试范围内禁用Poller。 我想我的问题有更多解决方案,我没有想到。 感谢所有帮助!

1 个答案:

答案 0 :(得分:0)

启动版本5.0 Spring Integration也为此事提供了Testing Framework Mocks。

@SpringIntegrationTest有一个属性:

/**
 * Specify a simple matching patterns ("xxx*", "*xxx", "*xxx*" or "xxx*yyy") for
 * {@link org.springframework.integration.endpoint.AbstractEndpoint}
 * bean names to mark them as {@code autoStartup = false}
 * during context initialization.
 * @return the endpoints name patterns to stop during context initialization
 * @see IntegrationEndpointsInitializer
 * @see org.springframework.util.PatternMatchUtils
 */
String[] noAutoStartup() default {};

这就是对用例有用的方法。

例如,如果个人资料为@Profile,您甚至无法创建bean时,可以使用test完成另一个选项。

否则,除非在测试开始时按此类型或其名称停止所有SourcePollingChannelAdapter bean,否则您无法选择。