将Mockito模拟注入到Spring bean中

我希望将一个Mockito模拟对象注入Spring(3+)bean中,以便使用JUnit进行单元测试。 我的bean依赖关系通过在私有成员字段上使用@Autowired注释来注入。

我已经考虑使用ReflectionTestUtils.setField但是我希望注入的bean实例实际上是一个代理,因此不会声明目标类的私有成员字段。 我不想为依赖创建一个公共setter,因为我将纯粹为了测试目的而修改我的接口。

我遵循了Spring社区给出的一些建议,但模拟不会被创建,并且自动布线失败:

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

我目前遇到的错误如下:

...
Caused by: org...NoSuchBeanDefinitionException:
    No matching bean of type [com.package.Dao] found for dependency:
    expected at least 1 bean which qualifies as autowire candidate for this dependency.
    Dependency annotations: {
        @org...Autowired(required=true),
        @org...Qualifier(value=dao)
    }
at org...DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(D...y.java:901)
at org...DefaultListableBeanFactory.doResolveDependency(D...y.java:770)

如果我将constructor-arg值设置为无效,则启动应用程序上下文时不会发生错误。


最好的方法是:

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

更新
在上下文文件中,此模拟必须在任何自动布线字段取决于其声明之前列出。


@InjectMocks
private MyTestObject testObject;

@Mock
private MyDependentObject mockedObject;

@Before
public void setup() {
        MockitoAnnotations.initMocks(this);
}

这会将任何模拟对象注入到测试类中。 在这种情况下,它会将mockedObject注入到testObject中。 这是上面提到的,但这里是代码。


我有一个使用Spring Java Config和Mockito的非常简单的解决方案:

@Configuration
public class TestConfig {

    @Mock BeanA beanA;
    @Mock BeanB beanB;

    public TestConfig() {
        MockitoAnnotations.initMocks(this); //This is a key
    }

    //You basically generate getters and add @Bean annotation everywhere
    @Bean
    public BeanA getBeanA() {
        return beanA;
    }

    @Bean
    public BeanB getBeanB() {
        return beanB;
    }
}
链接地址: http://www.djcxy.com/p/50899.html

上一篇: Injecting Mockito mocks into a Spring bean

下一篇: Execute method on startup in spring