[SPRING] EasyMock 팩토리 메소드로 생성 된 빈의 자동 연결?
SPRINGEasyMock 팩토리 메소드로 생성 된 빈의 자동 연결?
나는 정말로 이상한 것처럼 보이는 문제가있다. 다음과 같은 설정이 있습니다.
인터페이스 :
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.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>
from https://stackoverflow.com/questions/6340007/autowiring-of-beans-generated-by-easymock-factory-method by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Jackson과 주석을 통해 일반 목록 디시리얼라이저를 정의하는 방법은 무엇입니까? (0) | 2019.02.07 |
---|---|
[SPRING] spring.profiles.include가 포함 된 프로필 포함은 include 대신 덮어 씌우기 것 같습니다. (0) | 2019.02.07 |
[SPRING] 두 날짜 간의 레코드를 조회하는 HQL (0) | 2019.02.07 |
[SPRING] Spring Security 3 처음 요청한 URL 가져 오기 (0) | 2019.02.07 |
[SPRING] Spring websocket stomp 서버에서 클라이언트 세션 연결 해제 (0) | 2019.02.07 |