Spring 테스트 프레임 워크 및 주석 기반 자동으로 바이러스 문제
-
12-09-2020 - |
문제
Spring의 TestFramework가있는 DAO에 대해 두 가지 다른 구현을 사용하고 싶습니다.
src.main.java
.businessobjects
\-User.java
.dao
\-IUserDAO.java
.daojpa
\-UserDAO.java
.daohibernate
\-UserDAO.java
.
스프링 테스트 케이스 :
src.test.java.base :
package base;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/hibernate-beans.xml")
@Transactional
public abstract class SpringTestCase {}
.
여기에 오류가 있습니다.
원인 : java.lang.IllegalStateException : 주석 - 지정된 bean 이름 Bean 클래스의 'UserDao' [jpadao.userdao] 기존의 충돌, 동일한 비 호환 빈 정의 이름과 클래스 [jpaadao.userdao]
나는 한정자를 사용하여 자동으로 오버라이드를 무시하려고 노력했다. :
<bean class="jpaadao.UserDAO">
<qualifier value="jpaa"/>
</bean>
<bean class="jpadao.UserDAO">
<qualifier value="jpa"/>
</bean>
.
및
가있는 테스트 케이스 배선에서@Autowired
@Qualifier("jpa")
private IUserDAO userDAO;
.
그러나 오류가 지속됩니다.
두 가지 질문 :
- 주석 기반 구성 으로이 문제는 어떻게 해결 될 수 있습니까?
- 어떻게 을 사용하지 않고 테스트를 실행할 수 있습니까?
해결책
봄이 이름을 제시하려고 시도 할 수 있도록 콩을 사용하고 있으므로이 이름은 아마도 클래스에있는 @Component 주석을 기반으로 할 수 있지만 캠프 케이스 버전이 될 수도 있습니다.빈 클래스 이름의 빈 클래스 이름 (두 경우 모두에서 평등하고 봄을 객체로 만듭니다).
또한 구성 요소 검색 및 XML 구성을 조금 홀수로 보이는 방식으로 믹싱하는 것 같습니다.
이 중 많은 방법이 있지만 가장 깨끗하게 당신은 FullFil을 시도하는 계약을 구현하는 단일 빈만 사용합니다.다른 구현이 필요하면 다른 구현이 필요합니다.
<bean id="jpaUserRepository" class="..JpaUserRepository"/>
.
자동 배선을 의지하기 때문에 빈 이름이 사용되지 않아도 유용한 로깅을 제공합니다.
다른 팁
- 는 iWein이 제안한 것을 수행합니다. 구현 수업 이름을 더 잘 지정하십시오 (예 : hibernateuserdao 및 jpauserdao).또는 UserDAO 구현 클래스에서 @Component 또는 @ Repository 주석을 통해 고유 한 빈 이름을 지정하십시오.
- 현재 자동 으로우지 않고 테스트를 실행할 수 없습니다.자세한 내용은이 JIRA 문제를 참조하십시오 : https://jira.springsource.org/browse/spr-6050
감사합니다.
SAM (Spring TestContext 프레임 워크의 저자)
p.s.아니요, 당신이 직면하는 문제는 SPR-4524와 관련이 없습니다.
@Resource
주석을 사용하여 종속성 by-name을 주입 할 수 있습니다.이름 (IDS)을 bean에 제공하거나 기본값을 사용할 수없는 클래스 이름 인 기본값을 사용해야합니다.
나는 그것을 가지고 있고 지금 달리고있다!그러나 나는 이것이 모범 사례라고 믿지 않는다.나는 단순히 appcontext.xml에 글을 쓰고 원치 않는 DAO의 경로를 제외했습니다.
<context:component-scan base-package="test">
<context:exclude-filter type="regex" expression="test\.daohibernate.*"></context:exclude-filter>
</context:component-scan>
.
모든 제안?이 문제는 http://jira.springframework.org/browse/springframework.org/browse/springframework.org/browse/spr-4524 ?