복붙노트

[SPRING] EasyMock 팩토리 메소드로 생성 된 빈의 자동 연결?

SPRING

EasyMock 팩토리 메소드로 생성 된 빈의 자동 연결?

나는 정말로 이상한 것처럼 보이는 문제가있다. 다음과 같은 설정이 있습니다.

인터페이스 :

package com.example;

public interface SomeDependency {
}

스프링 구성 요소 :

package com.example;

@Component
public class SomeClass {
}

EasyMock에서 생성 된 mocked bean을 사용한 스프링 테스트 설정 :

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

그리고 단위 테스트 :

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/testconfig.xml")
public class SomeClassTest {

    @Autowired
    SomeClass someClass;

    @Autowired
    SomeDependency someDependency;

    @Test
    public void testSomeClass() throws Exception {
        assertNotNull(someClass);
    }

    @Test
    public void testSomeDependency() throws Exception {
        assertNotNull(someDependency);
    }
}

프로젝트가 컴파일되고 테스트가 아무 문제없이 통과합니다. 즉, SomeClass ( "실제"개체)와 SomeDependency (EasyMock에서 생성 된 모의 개체)의 autowiring이 성공합니다.

그러나 SomeClass의 구현을 다음과 같이 변경하면 :

@Component
public class SomeClass {

    @Autowired
    SomeDependency someDependency;
}

두 가지 테스트 모두 실패합니다.

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)}

그래서 내 질문은 :

Comment : 실제로 SomeClass로 표현되는 클래스는 프레임 워크의 일부입니다. 결과적으로 적어도 적당한 시간 내에 업데이트 될 수 없습니다.

종속성 :

편집하다:

Spring 3.2 RC1에서 일반 팩토리 메소드와 모의 객체의 문제가 해결되었습니다.

/ 마티아스

해결법

  1. ==============================

    1.autowiring으로 bean을 생성하기 위해 팩토리를 사용할 때 xml의 정의 순서가 실제로 중요해 보입니다. someInterfaceMock 선언을 component-scan 위에 놓으면 제대로 작동합니다.

    autowiring으로 bean을 생성하기 위해 팩토리를 사용할 때 xml의 정의 순서가 실제로 중요해 보입니다. someInterfaceMock 선언을 component-scan 위에 놓으면 제대로 작동합니다.

    이유 설명 : Spring이 SomeClass를 autowire하려고 시도 할 때 SomeDependency 타입의 빈을 찾는다. 이 단계에서 someInterfaceMock은 여전히 ​​공장이므로 Spring은 를 반환하는 팩토리 메소드 EasyMock.createMock (...)의 서명을 검사하므로 Spring은 필요한 유형이 아닌 객체 만 찾습니다.

    더 좋은 방법은 Spring의 FactoryBean 인터페이스를 사용하여 mock을 생성하는 것입니다.

    다음은 작동해야하는 기본 구현입니다.

    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>    
    
  2. from https://stackoverflow.com/questions/6340007/autowiring-of-beans-generated-by-easymock-factory-method by cc-by-sa and MIT license