2010-05-16 115 views
8

小背景:如何覆盖Spring的行为@Autowired

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

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

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

现在的问题:

注:我使用的测试环境不同的弹簧语境。

我有一个类FOO@Autowired但在测试方面,我想使用不同的类的相同类型的MockFoo(延伸FOO)。

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

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

我期待Spring允许使用Context配置文件来重写bean注入或者让Spring不自动装载特定的bean。

所有这些选择似乎仅适用于最初在Spring上下文配置文件中定义的豆存在。

回答

6

使用ReflectionTestUtils手动设置到位的自动装配Autowired依赖素(为目的进行管理你的模拟不能用弹簧,所以没有歧义存在)

+0

这是当你没有注入到多个类相同的实例很好地解决 - 但在一个大的项目,其中一类行为作为一个服务提供者(这是一个单身人士),并注入到许多类,我希望有一些更容易/更好的解决方案,以避免注入使用原始的每个类 – Mark 2010-05-19 15:52:15

2

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

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

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

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

好的答案,我真的会去与这一个。不要忘记,您可以在要注入bean的bean上使用@Qualifier(name =“someBean”),并在要注入特定bean实例的字段上使用@Resource(name =“someBean”)。 – 2011-09-23 17:02:53