在单元测试中禁用JMS使用bean

时间:2017-05-24 06:27:11

标签: java spring unit-testing jms javabeans

我构建了一个接收JMS消息的Spring应用程序(@JmsListener)。 在开发期间,我想将一些消息发送到侦听器侦听的JMS队列,因此我编写了一个发送一些消息的单元测试(JmsTemplate)。在这个单元测试中,我使用@SpringBootTest@RunWith(SpringRunner.class)来加载应用程序上下文(数据源的bean等)。

然而,当单元测试开始时,它还会加载直接开始使用我的新消息的jms监听器bean。

我想在此测试场景中禁用此jms侦听器bean,以便将消息添加到队列中。然后,我可以启动主应用程序并观察它们被消耗。

我该如何处理?

我想我也可以问过如何禁用bean。

提前致谢。

4 个答案:

答案 0 :(得分:6)

您可以使用个人资料来解决此问题。

向您的听众添加@Profile注释:

@Profile("!test-without-jmslistener")
public class JmsListenerBean {
    ...
}

这告诉Spring,如果配置文件“test-without-jmslistener”处于活动状态(感叹号否定条件),它应该只创建此bean的实例。

在单元测试类中,添加以下注释:

@ActiveProfiles("test-without-jmslistener)
public class MyTest {
    ...
}

现在Spring测试运行器将在运行测试之前激活此配置文件,Spring将不会加载您的bean。

答案 1 :(得分:0)

此问题的另一个解决方案:将@SpringBootTest @RunWith(SpringRunner.class) @ComponentScan(basePackages="com.pechen.demo", excludeFilters=@Filter(type=FilterType.ASSIGNABLE_TYPE, classes=JmsListener.class)) public class MyTest(){ } 添加到测试类以跳过指定bean的加载。

<p class="text-justify last-body" ng-app>
  This growing collection of studies, curated by 
  <a ng-init="imgsrc={
    src: 'http://wallpaper-gallery.net/images/pig-images/pig-images-12.jpg',
    show: false,
  };">
  <span ng-mouseover="imgsrc.show = true" ng-mouseout="imgsrc.show = false">
      Yours Truly
  </span>
  <img ng-src="{{ imgsrc.src }}" ng-show="imgsrc.show" />
  </a>, 
  is focused primarily
  on studies dealing with eh tohp ah key pig*. As a fan of mooshoo and aigeiaig, I'm open to 
  working with any dataset ranging from yakdkat studies to lakuktauka. If you would like
  to submit a study for publishing, or if you have any questions about a particular study,
  please feel free to <a href="/contact">Contact Me.</a> Thank you for visiting, and happy wamotiem!
</p>

请再参考spring component scan include and exclude filters

答案 2 :(得分:0)

我认为您可以通过以下代码来做到这一点:-

private void stopJMSListener() {
    if (customRegistry == null) {
        customRegistry = context.getBean(JmsListenerEndpointRegistry.class);
    }
    customRegistry.stop();
}

private void startJMSListener() {
    if (customRegistry == null) {
        customRegistry = context.getBean(JmsListenerEndpointRegistry.class);
    }
    customRegistry.start();
}

答案 3 :(得分:0)

除了使用配置文件,您还可以通过以下属性来实现此目的:

@ConditionalOnProperty(name = "jms.enabled", matchIfMissing = true)
public class JmsListenerBean {
    ...
}

matchIfMissing属性告诉Spring默认情况下将此属性设置为true。 在测试类中,您现在可以禁用JmsListenerBean:

@TestPropertySource(properties = "jms.enabled=false")
public class MyTest {
    ...
}