2010-07-08 3 views
5

스프링의 testframework가있는 DAO에 두 가지 다른 구현을 사용하고 싶습니다.스프링 테스트 프레임 워크와 어노테이션 기반 autowiring 문제

src.main.java

.businessobjects 
    \-User.java 
.dao 
    \-IUserDAO.java 
.daojpa 
    \-UserDAO.java 
.daohibernate 
    \-UserDAO.java 

의 스프링 테스트 케이스 :

src.test.java.base :

Caused by: java.lang.IllegalStateException: Annotation-specified bean name 'userDAO' for bean class [jpadao.UserDAO] conflicts with existing, non-compatible bean definition of same name and class [jpaadao.UserDAO]

: 여기

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

그리고 오류입니다

나는 이미 th를 무시하려고 시도했다. 전자

@Autowired 
@Qualifier("jpa") 
private IUserDAO userDAO; 

과 사용 규정에 의한 autowiring을, 예컨대 : 테스트 케이스 배선에서 다음

<bean class="jpaadao.UserDAO"> 
    <qualifier value="jpaa"/> 
</bean> 
<bean class="jpadao.UserDAO"> 
    <qualifier value="jpa"/> 
</bean> 

그리고 있지만 오류가 계속.

두 질문 :

  1. 방법이 문제가 주석 기반 구성으로 해결 될 수있다?
  2. 테스트를 실행하려면 어떻게해야합니까? 없이 autowiring 및 특수 효과를 사용할 수 있습니까?

답변

2

이름없이 콩을 사용하고 있기 때문에 Spring이 이름을 만들려고하는데이 이름은 아마도 클래스에있는 @Component 주석을 기반으로 할 수 있지만 camelcased 버전 일 수도 있습니다. bean의 정규화되지 않은 클래스 이름 (두 경우 모두 동등한 결과를 얻고 Spring이 객체를 생성하게 만듭니다).

또한 구성 요소 검사와 XML 구성을 약간 이상하게 보입니다.

여기에는 여러 가지 방법이 있지만, 깔끔하게 작성하려는 계약서를 구현하는 하나의 bean 만 사용하는 것이 가장 좋습니다. 당신이 다른 구현을 필요로 할 경우에 당신은 그들에게 다른 더 discriptive 이름을 지정해야합니다

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

이 당신이 자동 배선에 의존하기 때문에 빈 이름이 사용되지 않는 경우에도, 당신에게 더 유용한 로깅을 제공 할 것입니다.

+0

그리고 @Resource 대신 @Autowired를 사용했습니다? –

+1

@Resource는 @Autowired보다 유연성이 떨어집니다. 당신이 그것과 함께 묶는 클래스에 Spring 의존성을 가지고 있고, EJB를 와이어 링하기 위해 Spring을 사용한다면 테스트 케이스는 그것과 아무런 관련이 없다. 특히 Spring 3의 최신 버전은 일치하는 필드 이름에 autowiring disambiguation를 지원하기 때문에 그렇다. – iwein

0

@Resource 주석을 사용하여 종속성을 주입 할 수 있습니다. bean에 이름 (ids)을 주거나 기본값 (비 문자 화되지 않은 규정되지 않은 클래스 이름)을 사용해야합니다.

+0

답변 주셔서 감사합니다. 그러나 작동하지 않았습니다 .--( –

+1

_how_ 작동하지 않았습니까? – Bozho

+0

정확히 같은 오류가 발생합니다. 잠시만 기다려주세요. 전체 소스를 압축합니다. 코드를 다운로드하고 어딘가에 넣으십시오. –

0

나는 지금 그것을 달리고 달리고있다! 그러나 이것이 최선의 방법이라고 생각하지 않습니다. 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/SPR-4524과 관련이 있습니까?

1
  1. 필자의 주장대로 수행하십시오., HibernateUserDao 및 JpaUserDao); UserDAO 구현 클래스에서 @Component 또는 @Repository 주석을 통해 고유 한 bean 이름을 지정하십시오.
  2. 현재 자동 배선 기능 없이는 테스트를 실행할 수 없습니다. https://jira.springsource.org/browse/SPR-6050

감사합니다,

샘 (스프링 TestContext 프레임 워크의 저자)

추신 :이 내용은 JIRA 문제를 참조하십시오 아니요, 문제는 SPR-4524와 관련이 없습니다.

관련 문제