spring - mock Spring Bean

标签 spring mocking autowired

我想继续this问题。

这些答案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;
    }
}


<bean id="mockFactory" name="someType" class="com.example.MocksFactory" >
    <property name="type" value="com.example.SomeType" />
</bean>

但是使用 org.mockito.Mockitomock()工厂方法不起作用
<bean id="dao" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="com.example.SomeType" /> 
</bean> 

当 Autowiring 时,一个得到 No matching bean of type [ com.example.SomeType ] ...。

@自动连线
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>

因为没有 id & name 它不会推断类型。

最佳答案

当 XML 文件应该与标准 spring/mockito jar 一起使用时,您可以使用 ProxyFactoryBean 并且它可以与 Autowiring 一起使用(在 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> 

关于spring - mock Spring Bean ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6976421/

相关文章:

spring - 为什么 Cobertura 不能在我的 Spring/Hibernate Webapp 中工作?

unit-testing - 创建易于维护的测试

c# - Java 中哪个最好;模拟接口(interface)还是模拟类?

java - 可定制的@Autowired

java - 明显的 Spring Boot 竞争条件导致重复的 springSecurityFilterChain 注册

Spring 加载 : Integration with Spring MVC maven project

unit-testing - 如何覆盖 Spring @Autowired 的行为

c# - 假 DataRepository - 模拟数据库

java - Bean 在不使用 @Autowired 的情况下被注入(inject)

java - Autowiring 似乎失败