一点背景:
我正在使用Spring 2.5,特别是Spring IOC和注释。
我在我的代码中使用@Autowired
(自动装配按类型完成)
并使用@Component
将类暴露给自动接线。
当我尝试测试我的代码时,出现了下面描述的情况。
现在问题:
注意:我为测试环境使用不同的Spring Context。
我有一个FOO
类@Autowired
,但在测试环境中,我想使用相同类型MockFoo
的其他类(扩展FOO
)。< / p>
由于FOO
类的依赖注入的多个选项(FOO
和MockFOO
符合类型检查),Spring设置当然会自动失败。
我正在寻找一种方法来注入测试bean而不是原始的bean。
我希望Spring允许使用Context配置文件覆盖bean注入或命令Spring不要自动装配特定的bean。
但是
所有这些选项似乎只存在于最初在Spring Context Configuration文件中定义的bean。
答案 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 {....}