Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.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
Java 如何在测试期间模拟spring组件而不从中提取接口?_Java_Spring_Unit Testing_Interface_Mockito - Fatal编程技术网

Java 如何在测试期间模拟spring组件而不从中提取接口?

Java 如何在测试期间模拟spring组件而不从中提取接口?,java,spring,unit-testing,interface,mockito,Java,Spring,Unit Testing,Interface,Mockito,有一个带有@Component注释的spring组件,它只是带有注释的@Autowired字段的java类(不是接口)。我试图创建这样的模拟: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/sc

有一个带有
@Component
注释的spring组件,它只是带有注释的
@Autowired
字段的java类(不是接口)。我试图创建这样的模拟:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
    >
  <bean id="myComponent" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="com.MyComponent"/>
  </bean>
</beans>

有什么想法吗?

Spring无法自动连接bean,因为创建的bean的类型是
java.lang.Object
,而不是
com.myComponent
。显然,XML中定义的顺序也很重要

Jayway有一篇很好的博客文章:

您可以创建一个
FactoryBean
,它返回正确的类:

public class MockitoFactoryBean<T> implements FactoryBean<T> {

    private Class<T> classToBeMocked;

    /**
     * Creates a Mockito mock instance of the provided class.
     * @param classToBeMocked The class to be mocked.
     */
    public MockitoFactoryBean(Class<T> classToBeMocked) {
        this.classToBeMocked = classToBeMocked;
    }

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

    @Override
    public Class<?> getObjectType() {
        return classToBeMocked;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
公共类MockitoFactoryBean实现FactoryBean{
要删除的私有类;
/**
*创建所提供类的Mockito mock实例。
*@param classto删除要模拟的类。
*/
公共MockitoFactoryBean(类classToBeMocked){
this.classToBeMocked=classToBeMocked;
}
@凌驾
public T getObject()引发异常{
返回Mockito.mock(classToBeMocked);
}
@凌驾
公共类getObjectType(){
返回要删除的类;
}
@凌驾
公共布尔isSingleton(){
返回true;
}
}
使用这个工厂bean,您可以创建如下配置:

<bean id="myComponent" class="com.yourpackage.MockitoFactoryBean">
    <constructor-arg name="classToBeMocked" value="com.myComponent" />
</bean>

这将模拟组件,对象类型将
com.myComponent


更新


这是原始答案和解释(使用EasyMock):

请向我们展示需要自动连接的类的代码和bean的定义。首先,对于Spring和Mockito,我更喜欢使用接口。在您的例子中,为什么不简单地添加另一个(模拟的)bean,并通过
ref
将其插入到构造函数中呢。。。?但是,您需要在构造函数中放入的bean实际上是一个java.lang.Class对象吗?听起来很奇怪。“为什么不简单地添加另一个(mocked?)bean”-这正是第
class=“org.mockito.mockito”factory method=“mock”
“但是您需要放入构造函数的bean实际上是一个java.lang.class对象”-请仔细阅读
class=“org.mockito.mockito”factory method=“mock”
。没有承包商电话。在
Mockito
类中有一个工厂方法调用。对不起,这是我的错,思维错误。这里有一个提示,声明必须在其他人之前,但我想你已经知道了。。。
<bean id="myComponent" class="com.yourpackage.MockitoFactoryBean">
    <constructor-arg name="classToBeMocked" value="com.myComponent" />
</bean>