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
Java 通过EasyMock工厂方法生成的bean的自动布线?_Java_Spring_Easymock_Autowired_Factory Method - Fatal编程技术网

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)}
因此,我的问题是:

  • 为什么Spring无法将依赖项自动关联到SomeClass(当它成功将相同的依赖项自动关联到SomeClassTest时)
  • 如何更改SomeClassTest或testconfig.xml以使测试通过
  • 注释:实际上,SomeClass表示的类是框架的一部分。因此,它不容易更新,至少不能在合理的时间内更新

    依赖项:

    • 弹簧:3.0.5.0释放
    • EasyMock:3.0
    编辑:

    从Spring3.2RC1开始,通用工厂方法和模拟对象的问题已经得到解决


    /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>