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>