嘲弄春豆

lis*_*sak 4 spring mocking autowired

我想继续这个问题.

这些答案foobar正是我所需要的.

但是对于bar示例spring不会推断从通用mock()方法返回的bean的类型.但实际上它与MockFactoryBean情况完全相同,这是有效的.

class MockFactoryBean<T> implements FactoryBean<T> {

    private Class<T> type;

    public void setType(final Class<T> type) {
        this.type = type;
    }

    @Override
    public T getObject() throws Exception {
        return (T) Mockito.mock(type);
    }

    @Override
    public Class<T> getObjectType() {
        return type;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

<bean id="mockFactory" name="someType" class="com.example.MocksFactory" >
    <property name="type" value="com.example.SomeType" />
</bean>
Run Code Online (Sandbox Code Playgroud)

但使用org.mockito.Mockitomock()工厂方法不起作用

<bean id="dao" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.example.SomeType" /> 
</bean> 
Run Code Online (Sandbox Code Playgroud)

并且当获得自动装配时,一个得到[com.example.SomeType]类型的匹配bean.

@Autowired public SomeType someType;

这是为什么 ?

使用MockFactoryBean的方式非常不方便,因为如果你必须模拟很多bean,你最终会像这样:

<bean id="mockFactory1" name="metadataExtractor" class="tests.base.MocksFactory" >
    <property name="type" value="processing.MetadataExtractor" />
</bean>
<bean id="mockFactory2" name="fileValidator" class="tests.base.MocksFactory" >
    <property name="type" value="validation.file.FileValidator" />
</bean>
<bean id="mockFactory3" name="documentMatcher" class="tests.base.MocksFactory" >
    <property name="type" value="validation.matching.DocumentMatcher" />
</bean>
<bean id="mockFactory4" name="uploadMatcher" class="tests.base.MocksFactory">
    <property name="type" value="validation.matching.UploadMatcher" />
</bean>
<bean id="mockFactory5" name="tempFileLocalService" class="tests.base.MocksFactory">
    <property name="type" value="service.TempFileLocalService" />
</bean>
<bean id="mockFactory6" name="orderLocalService" class="tests.base.MocksFactory">
    <property name="type" value="service.OrderLocalService" />
</bean>
<bean id="mockFactory7" name="counterLocalService" class="tests.base.MocksFactory">
    <property name="type" value="service.CounterLocalService" />
</bean>
Run Code Online (Sandbox Code Playgroud)

因为没有id和name,它不会推断出类型.

小智 7

当XML文件应该与标准的spring/mockito jar一起使用时,你可以使用ProxyFactoryBean,它可以用于自动装配(在Spring 2.5上测试).

<bean id="dao" class="org.springframework.aop.framework.ProxyFactoryBean">
   <property name="target"> <bean class="org.mockito.Mockito" factory-method="mock"> <constructor-arg value="com.package.Dao" /> </bean> </property>
   <property name="proxyInterfaces"> <value>com.package.Dao</value> </property>
</bean> 
Run Code Online (Sandbox Code Playgroud)