如何覆盖Spring @Autowired的行为

时间:2010-05-16 10:01:28

标签: unit-testing spring dependency-injection

一点背景:

我正在使用Spring 2.5,特别是Spring IOC和注释。

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

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

现在问题:

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

我有一个FOO@Autowired,但在测试环境中,我想使用相同类型MockFoo的其他类(扩展FOO)。< / p>

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

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

我希望Spring允许使用Context配置文件覆盖bean注入或命令Spring不要自动装配特定的bean。

但是

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

3 个答案:

答案 0 :(得分:6)

使用ReflectionTestUtils手动设置Mock代替自动连接的依赖项(为此目的,您的模拟不能进行弹簧管理,因此不存在歧义)

答案 1 :(得分:2)

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

由于你可能不想在你的上下文中混合使用Foo和MockFoo,我建议从组件扫描中删除Foo。这可以通过在<context:component-scan>上指定include/exclude filters来完成。

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

答案 2 :(得分:2)

我同意迪迪埃的观点。下面是一个示例,说明如何在测试应用程序上下文中排除要模拟的实现。

<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 {....}