2017-05-24 48 views
2

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

但是,当单元测试开始时,它还会加载直接开始消费我的新消息的jms侦听器bean。

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

我该如何解决这个问题?

我想我也可以问我如何可以禁用一般的bean。

在此先感谢。

回答

4

您可以使用配置文件来解决此问题。

到您的收听,添加@Profile注释:

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

这告诉Spring,它应该只创建这个bean的实例如果配置文件“测试不-jmslistener”是活动的(感叹号否定条件)。

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

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

现在Spring的测试运行程序将运行测试前启动此配置文件,Spring将不会加载你的bean。

+0

谢谢罗尔夫,它的工作! – codesmith

0

此问题的另一种解决方案:将@ComponentScan()添加到测试类,以跳过指定的bean的加载。

@SpringBootTest 
@RunWith(SpringRunner.class) 
@ComponentScan(basePackages="com.pechen.demo", [email protected](type=FilterType.ASSIGNABLE_TYPE, classes=JmsListener.class)) 
public class MyTest(){ 

} 

更多请参考spring component scan include and exclude filters