我有一组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。 我想我的问题有更多解决方案,我没有想到。 感谢所有帮助!
答案 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,否则您无法选择。