一尘不染

将Mockito模拟注入Spring Bean

spring

我想将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值设置为无效值,则启动应用程序上下文时不会发生错误。


阅读 977

收藏
2020-04-11

共2个答案

一尘不染

@InjectMocks
private MyTestObject testObject;

@Mock
private MyDependentObject mockedObject;

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

这会将所有模拟对象注入测试类。在这种情况下,它将嘲笑对象注入testObject中。上面已经提到了,但这是代码。

2020-04-11
一尘不染

最好的方法是:

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

更新
在上下文文件中,必须在根据其声明任何自动装配字段之前列出此模拟。

2020-04-11