2011-05-09 42 views
2

目前,我使用@Autowired,@Component,@Resource等技术连接了我的弹簧应用程序。现在我想编写一个测试,需要模拟系统中的特定对象,剩余物体的真实生产线。将模拟注入到不带xml的Spring容器中进行测试

让我们假设被测试的根对象被称为Foo。深入依赖链,Foo取决于Bar。目前,模拟出这个对象,我创建了一个测试的applicationContext.xml刚刚的一个bean条目:

<bean id="bar" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.package.Bar" /> 
</bean> 

的测试的applicationContext.xml在@ContextConfiguration注解声明,所以foo将最终取决于模拟的Bar对象。

是否有可能得到相同的结果,而不必拥有这个test-applicationContext.xml?即按相同的步骤进行?

因此,在伪代码,我在想,如果我能有这样的:

public class MyTest { 

    @Test 
    public void simple() { 
     // create mock Bar object 
     // register mock Bar object in container 
     // resolve Foo object with all its dependencies but use the mock Bar object instead of the real one 
     // set some expectations on the Bar object 
     // call some method on Foo 
    } 
} 

回答

3

你必须避免在单元测试开始Spring上下文。仅在检查属性注入和其他Spring功能的测试中使用Spring上下文。然后,您将能够创建编程式模拟对象。

BeanDefinitionRegistry registry = ((BeanDefinitionRegistry)factory); 

    GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); 
    beanDefinition.setBeanClass(MyBeanClass.class); 
    beanDefinition.setLazyInit(false); 
    beanDefinition.setAbstract(false); 
    beanDefinition.setAutowireCandidate(true); 
    beanDefinition.setScope("session"); 

    registry.registerBeanDefinition("dynamicBean",beanDefinition); 

只需注入您的JUnit你的BeanFactory拿到工厂去做

0

一种方法:

  1. Althought,它可以像完成您的测试环境,组件扫描最低限度。

  2. @Autowire Bar的依赖关系进入你的测试类。

在你的安装:

  1. 手动new Bar()

  2. 创建美孚的模拟

  3. 新的酒吧,包括@Autowired(第2号)和模拟的设置属性(第二#2)。

0

我有一个非常类似的问题,并使用https://bitbucket.org/kubek2k/springockito/wiki/Home这真的是对我很恶毒。

在你的情况下,你可以使用,如果你想要总模拟然后使用@ReplaceWithMock或者你可以使用@WrapWithSpy将做部分模拟,只有你可以模拟你想改变行为的功能。

相关问题