gpt4 book ai didi

java - 模拟 JMS 消息源

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:52 29 4
gpt4 key购买 nike

我有一组定期轮询的MessageSource(实际上是JmsDestinationPollingSource)。在底层,这是一个持久保存队列项目的 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();
}

但是,现在,我想制作一个 @SpringBootTest 当然没有 Oracle 持久性。

我现在这样做的方式是通过模拟(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

我尝试模拟所有 MessageSource 或所有 JmsDestinationPollingSource,但这似乎很难(我读过有关 PowerMockito 的内容,但尚未尝试,因为我认为可以以不同的方式完成)。

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

最佳答案

启动版本 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 {};

这就是它对您的用例有用的原因。

例如,如果配置文件是 test,当您甚至不创建 bean 时,可以使用 @Profile 完成另一个选项。

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

关于java - 模拟 JMS 消息源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45373162/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com