为了使用 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/