Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 嘲弄春豆_Spring_Mocking_Autowired - Fatal编程技术网

Spring 嘲弄春豆

Spring 嘲弄春豆,spring,mocking,autowired,Spring,Mocking,Autowired,我想继续提问 这些答案和答案正是我需要的 但对于示例,spring并没有推断从泛型mock()方法返回的bean的类型。但实际上,它与MockFactoryBean的情况完全相同,这是有效的 class MockFactoryBean<T> implements FactoryBean<T> { private Class<T> type; public void setType(final Class<T> type) {

我想继续提问

这些答案和答案正是我需要的

但对于示例,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;
    }
}
并且没有得到[com.example.SomeType]类型的匹配bean。。。自动布线时

@自动连线 公共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,它不会推断类型。

我在FactoryBean中进一步添加了一些代码,并将真正的模拟创建保留在我的测试类中。相反,我的FactoryBean在Spring启动时根据需要生成动态代理——这不会遇到您所看到的类型问题——并且测试可以根据需要在模拟中连接。我写了一篇文章,描述了如何做到这一点。这篇文章专门讨论了JAX-RS资源类的测试,但是如果你模糊了JAX-RS的内容,它可以作为一种替代方法独立运行。

当XML文件应该与标准spring/mockito JAR一起使用时,你可以使用ProxyFactoryBean,它可以与autowiring一起工作(在spring 2.5上测试)


com.package.Dao
我想到了什么:

public class SpringMocks implements ApplicationContextAware {

    private static final Logger logger = LoggerFactory.getLogger(SpringMocks.class);
    private final List<Class<?>> classes;

    public SpringMocks(List<Class<?>> classes) {
        this.classes = classes;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (applicationContext instanceof GenericApplicationContext) {
            GenericApplicationContext context = (GenericApplicationContext) applicationContext;
            DefaultListableBeanFactory beanFactory = context.getDefaultListableBeanFactory();

            for (Class<?> className : classes) {
                String beanName = RandomStringUtils.randomAlphanumeric(10);
                Object singletonObject = Mockito.mock(className);
                beanFactory.registerSingleton(beanName, singletonObject);
            }
        } else {
            logger.warn("unable to add beans to the context!");
        }
    }
}
公共类SpringMocks实现ApplicationContextAware{
私有静态最终记录器Logger=LoggerFactory.getLogger(SpringMocks.class);

私有最终列表做得很好,但我习惯于只留下第一眼就能看出来的解决方案。这需要花费大量精力才能得到它,而且在一段时间后,其他程序员和我自己都会反复使用:-)@lisak:我喜欢使用它,原因正好相反:它让你可以以同样的方式继续编写测试是的,和往常一样,所以并没有什么新习惯。这个例子对我来说很酷。
<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>
<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> 
public class SpringMocks implements ApplicationContextAware {

    private static final Logger logger = LoggerFactory.getLogger(SpringMocks.class);
    private final List<Class<?>> classes;

    public SpringMocks(List<Class<?>> classes) {
        this.classes = classes;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (applicationContext instanceof GenericApplicationContext) {
            GenericApplicationContext context = (GenericApplicationContext) applicationContext;
            DefaultListableBeanFactory beanFactory = context.getDefaultListableBeanFactory();

            for (Class<?> className : classes) {
                String beanName = RandomStringUtils.randomAlphanumeric(10);
                Object singletonObject = Mockito.mock(className);
                beanFactory.registerSingleton(beanName, singletonObject);
            }
        } else {
            logger.warn("unable to add beans to the context!");
        }
    }
}
<bean class="com.whatever.SpringMocks">
    <constructor-arg index="0">
        <list>
            <value>com.whatever.enricher.Enricher</value>
            <value>com.whatever.nimbus.NimbusOrderDao</value>
            <value>com.whatever.nimbus.NimbusAllocationDao</value>
            <value>com.whatever.nimbus.NimbusExecutionDao</value>
            <value>com.whatever.nimbus.NimbusBookingInstructionDao</value>
            <value>com.whatever.services.SettingsService</value>
            <value>com.whatever.matchers.utils.CVDataRetriever</value>
        </list>
    </constructor-arg>
</bean>