如何覆盖Spring @Autowired的行为

一点背景:

我使用Spring 2.5,特别是Spring IOC和注解。

我在我的代码中使用@Autowired (自动装配按类型完成),并使用@Component将类暴露给自动布线。

当我试图测试我的代码时,下面描述的情况就出现了。

现在来解决这个问题:

注意:我在测试环境中使用了不同的Spring Context。

我有一个FOO类,它是@Autowired但在测试环境中,我想使用不同类的相同类型的MockFoo (扩展FOO )。

由于FOO类的依赖注入的多个选项( FOOMockFOO符合类型检查),Spring的设置当然会自动失败。

我正在寻找一种方法来注入测试bean,而不是原始的bean。

我期望Spring允许使用Context配置文件来覆盖bean注入或者让Spring不自动调用特定的bean。

所有这些选项似乎只存在于最初在Spring Context Configuration文件中定义的bean。


使用ReflectionTestUtils手动设置模拟代替自动装配的依赖关系(为此目的,你的模拟不能被弹簧管理,以便不存在任何歧义)


我知道这个问题很老,但我认为答案可能对其他人有用。

既然你可能不想在你的上下文中混合使用Foo和MockFoo,我会建议从组件扫描中移除Foo。 这可以通过例如在<context:component-scan>上指定包含/排除过滤器来完成。

但是,如果你正在实现单元测试,我宁愿建议不要使用Spring上下文,而是通过手动注入依赖关系的模型来实现“纯粹”单元测试,以便你只测试一个类。 这可以通过使用像Mockito这样的模拟框架来实现。


我同意迪迪埃。 下面是一个如何排除您想要在测试应用程序上下文中进行模拟的实现的示例。

<context:component-scan base-package="com.company" >
    <context:exclude-filter type="regex" expression="com.abc.service.XDaoImpl"/>    
</context:component-scan>

在你的测试中包含这个应用上下文,如下所示

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/applicationContext-test.xml"})
public class MyTest {....}
链接地址: http://www.djcxy.com/p/67719.html

上一篇: How to override the behavior of Spring @Autowired

下一篇: How do you set Enum keys in a Map with annotations