如何使Spring忽略@autowired jmsTemplate字段用于测试目的?

时间:2013-10-01 04:09:59

标签: java spring jms autowired

我创建了一个使用JMSTemplate将电子邮件请求放入JMS队列的类。

问题在于,当我运行单元测试时,它会抛出异常,因为它无法创建Sender bean,因为JBoss Application Server提供的自动装配JMSTemplate bean存在问题。当然,它不能自动装配它。在进行单元测试时,JBoss没有运行。

所以我创建了两个spring上下文配置:一个用于生产范围,另一个用于测试范围。在测试上下文配置中,我已从包含Sender类的包中删除了组件扫描。它没有用,因为在其他一些地方使用了Sender类,所以我摆脱了JMSTemplate问题并用另一个bean创建错误替换它。

必须创建Sender bean。 有没有什么方法可以忽略单个自动连接字段用于测试目的? 我正计划在集成测试期间测试Sender功能。

在这种情况下,我认为不需要任何代码。 谢谢。

2 个答案:

答案 0 :(得分:1)

如果您正在使用基于javabased的容器配置,则可以在测试配置中代理该bean。我们遇到了类似的问题,我们最终得到了一个解决方案,我们在测试上下文配置中忽略ComponentScan中的bean,并创建一个简单的代理

忽略bean的配置示例:

@Configuration
@ComponentScan( // ...
    excludeFilters = {
        @ComponentScan.Filter(
            type = FilterType.ASSIGNABLE_TYPE, value = IgnoredInterface.class)
        }

代理bean创建示例:

@Bean 
public IgnoredInterface ignoredInterface() {
    return (IgnoredInterface) Proxy.newProxyInstance(
        IgnoredInterface.class.getClassLoader(),
        new Class[] { IgnoredInterface.class },
        new MyInvocationHandler();

MyInvocationHandlerInvocationHandler的一个简单实现,只是强制转换UnsupportedOperationException

答案 1 :(得分:0)

看起来我设法通过使用:

自行解决
@Autowired(required=false)

在冲突的自动装配字段上。 我希望它有所帮助。

然而,允许单元测试影响生产代码的变化可能不是最好的想法,因此在测试期间模拟JmsTemplate可能是理想的解决方案。