문제

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

그러나 오류가 지속됩니다.

두 가지 질문 :

  1. 주석 기반 구성 으로이 문제는 어떻게 해결 될 수 있습니까?
  2. 어떻게 을 사용하지 않고 테스트를 실행할 수 있습니까?
도움이 되었습니까?

해결책

봄이 이름을 제시하려고 시도 할 수 있도록 콩을 사용하고 있으므로이 이름은 아마도 클래스에있는 @Component 주석을 기반으로 할 수 있지만 캠프 케이스 버전이 될 수도 있습니다.빈 클래스 이름의 빈 클래스 이름 (두 경우 모두에서 평등하고 봄을 객체로 만듭니다).

또한 구성 요소 검색 및 XML 구성을 조금 홀수로 보이는 방식으로 믹싱하는 것 같습니다.

이 중 많은 방법이 있지만 가장 깨끗하게 당신은 FullFil을 시도하는 계약을 구현하는 단일 빈만 사용합니다.다른 구현이 필요하면 다른 구현이 필요합니다.

<bean id="jpaUserRepository" class="..JpaUserRepository"/>
.

자동 배선을 의지하기 때문에 빈 이름이 사용되지 않아도 유용한 로깅을 제공합니다.

다른 팁

  1. 는 iWein이 제안한 것을 수행합니다. 구현 수업 이름을 더 잘 지정하십시오 (예 : hibernateuserdao 및 jpauserdao).또는 UserDAO 구현 클래스에서 @Component 또는 @ Repository 주석을 통해 고유 한 빈 이름을 지정하십시오.
  2. 현재 자동 으로우지 않고 테스트를 실행할 수 없습니다.자세한 내용은이 JIRA 문제를 참조하십시오 : https://jira.springsource.org/browse/spr-6050
  3. 감사합니다.

    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 ?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top