【问题标题】:How to make Spring ignore an @autowired jmsTemplate field for test purposes?如何让 Spring 忽略 @autowired jmsTemplate 字段以进行测试?
【发布时间】:2013-10-01 04:09:58
【问题描述】:

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

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

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

必须创建 Sender bean。 出于测试目的,Spring 有什么方法可以忽略单个自动装配字段? 我计划在集成测试期间测试 Sender 功能。

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

【问题讨论】:

标签: java spring jms autowired


【解决方案1】:

如果您使用基于 java 的容器配置,您可以在测试配置中代理 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

【讨论】:

    【解决方案2】:

    看起来我设法自己解决了这个问题:

    @Autowired(required=false)
    

    关于冲突的自动装配字段。 我希望它可以帮助某人。

    但是,允许单元测试影响对生产代码的更改可能不是最好的主意,因此在测试期间连接一个虚拟 JmsTemplate 可能是理想的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多