Java 通过EasyMock工厂方法生成的bean的自动布线?
我有一个对我来说很奇怪的问题。我有以下设置: 接口:Java 通过EasyMock工厂方法生成的bean的自动布线?,java,spring,easymock,autowired,factory-method,Java,Spring,Easymock,Autowired,Factory Method,我有一个对我来说很奇怪的问题。我有以下设置: 接口: package com.example; public interface SomeDependency { } 弹簧组件: package com.example; @Component public class SomeClass { } 带有EasyMock生成的模拟bean的spring测试配置: <beans ....> <context:component-scan base-package="c
package com.example;
public interface SomeDependency {
}
弹簧组件:
package com.example;
@Component
public class SomeClass {
}
带有EasyMock生成的模拟bean的spring测试配置:
<beans ....>
<context:component-scan base-package="com.example"/>
<bean id="someInterfaceMock" class="org.easymock.EasyMock" factory-method="createMock">
<constructor-arg value="com.example.SomeDependency" />
</bean>
</beans>
项目编译并顺利通过测试,即SomeClass(一个“真实”对象)和SomeDependency(一个由EasyMock生成的模拟对象)的自动连接成功
但是,如果我将SomeClass的实现更改为:
两个测试都失败了,因为
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.example.SomeDependency] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
因此,我的问题是:
- 弹簧:3.0.5.0释放
- EasyMock:3.0
/Mattias当使用工厂通过自动连接创建bean时,xml中定义的顺序似乎实际上很重要。如果您将
someInterfaceMock
的声明放在组件扫描
上方,它将起作用
解释原因:当Spring尝试自动连接SomeClass
时,它会搜索类型为SomeDependency
的bean。在此阶段,someInterfaceMock
仍然是一个工厂,因此Spring检查工厂方法EasyMock.createMock(…)
的签名,该方法返回
,因此Spring只找到一个不需要的对象
更好的方法是使用Spring的FactoryBean
接口来创建模拟
下面是一个基本的实现,应该可以工作:
public class EasyMockFactoryBean<T> implements FactoryBean<T> {
private Class<T> mockedClass;
public void setMockedClass(Class mockedClass) {
this.mockedClass = mockedClass;
}
public T getObject() throws Exception {
return EasyMock.createMock(mockedClass);
}
public Class<T> getObjectType() {
return mockedClass;
}
public boolean isSingleton() {
return true;
}
}
公共类EasyMockFactoryBean实现FactoryBean{
私有类mockedClass;
public void setMockedClass(类mockedClass){
this.mockedClass=mockedClass;
}
public T getObject()引发异常{
返回EasyMock.createMock(mockedClass);
}
公共类getObjectType(){
返回mockedClass;
}
公共布尔isSingleton(){
返回true;
}
}
下面是bean定义(顺序无关紧要!):
谢谢!order做到了这一点,但我认为我将使用EasyMockFactoryBean实现,考虑到以后可能不得不模拟其他依赖项。
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.example.SomeDependency] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
public class EasyMockFactoryBean<T> implements FactoryBean<T> {
private Class<T> mockedClass;
public void setMockedClass(Class mockedClass) {
this.mockedClass = mockedClass;
}
public T getObject() throws Exception {
return EasyMock.createMock(mockedClass);
}
public Class<T> getObjectType() {
return mockedClass;
}
public boolean isSingleton() {
return true;
}
}
<bean class="com.example.EasyMockFactoryBean">
<property name="mockedClass" value="com.example.Dependancy"/>
</bean>