2010-07-08 58 views
5

我想爲Spring的測試框架使用兩種不同的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 {} 

這裏是錯誤:

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]

我已經嘗試覆蓋th通過預選賽Ë自動裝配,例如:

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

然後在測試用例佈線與

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

但錯誤依然存在。

兩個問題:

  1. 如何這個問題,基於註解配置來解決?
  2. 如何運行測試而不是自動裝配和註釋?

回答

2

您正在使用沒有名稱的bean,因此Spring會嘗試創建一個名稱,該名稱可能基於您可能對您的類所使用的@Component註釋,但也可能是基於附帶的版本你的bean的非限定類名(在這兩種情況下它們會相等並導致Spring反對)。

另外,它似乎是混合組件掃描和xml配置的方式,看起來有點奇怪。

有很多方法可以解決這個問題,但最乾淨的方法是隻使用一個bean來執行您試圖填充的合同。如果您確實需要不同的實現方式,你應該給他們不同,更discriptive名稱:

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

這會給你更多的有用的日誌記錄,即使bean的名字永遠不會使用,因爲你依靠自動佈線。

+0

而我繼續使用@Autowired而不是@Resource? – 2010-07-08 23:17:58

+1

@Resource不如@Autowired靈活,我只會在不能使用時才使用它如果你使用Spring來連接EJB,你的測試用例與它沒有任何業務關係,特別是因爲最新版本的Spring 3支持在匹配字段名稱上自動消除歧義。 – iwein 2010-07-09 20:08:13

0

您可以嘗試使用@Resource批註注入依賴項的名稱。您將不得不爲bean提供名稱(id),或者使用缺省值,這是非資本化的非限定類名。

+0

感謝您的回答,但是,我試過了,但它沒有工作:-( – 2010-07-08 10:30:49

+1

_how_它沒有工作嗎? – Bozho 2010-07-08 10:35:42

+0

我得到完全相同的錯誤。請稍等片刻,我會打包整個來源代碼,並把它放在一個地方下載... – 2010-07-08 11:50:24

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. 做什麼Iwein建議:更好地命名您的實施類(例如,,HibernateUserDao和JpaUserDao);或通過您的UserDAO實現類中的@Component或@Repository註釋指定唯一的bean名稱。
  2. 您目前無法在無自動裝配的情況下運行測試。詳情請參閱此JIRA問題:https://jira.springsource.org/browse/SPR-6050

問候,

山姆(Spring的TestContext框架的作者)

附:不,您面臨的問題與SPR-4524無關。