spring - 将 Mockito 模拟注入(inject) Spring bean

标签 spring dependency-injection junit annotations mockito

为了使用 JUnit 进行单元测试,我想将 Mockito 模拟对象注入(inject) Spring (3+) bean。我的 bean 依赖项目前是通过在私有(private)成员字段上使用 @Autowired 注释来注入(inject)的。

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

我关注了一些advice由 Spring 社区提供,但未创建模拟并且 Autowiring 失败:

<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> 

更新
在上下文文件中,这个模拟必须在任何依赖它的 Autowiring 字段被声明之前列出。

关于spring - 将 Mockito 模拟注入(inject) Spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2457239/

相关文章:

java - Spring在类级别使用@EnableScheduling进行注释

php - Symfony:如何获取所有服务及其各自的类

java - 如何使用 guice 使用通用 jsonFile 处理程序?

c# - Autofac 参数化实例化,对不同的参数有不同的解析

java - 与 RabbitMQ 的模拟连接

java - JUnit:如何提供公开我的所有方法以便进行测试

java - Spring注入(inject)一个单元素Set而不是一个空Set

java - @AfterReturning 方面在切入点方法的同一事务中执行?

java - 如何在使用 ant 运行 junit 时阻止来自 junit 的额外消息?

java - Spring keystore bean