1

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

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

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

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

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

4

2 回答 2

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();

MyInvocationHandler是一个简单的实现,InvocationHandler它只是投射一个UnsupportedOperationException

于 2013-11-14T09:05:10.190 回答
0

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

@Autowired(required=false)

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

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

于 2013-10-01T07:33:04.480 回答