2010-07-08 17 views
5

Vorrei utilizzare due diverse implementazioni per un DAO con il framework di prova di Spring.Spring Test Framework e autowiring basato su annotazione Problema

src.main.java

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

Il TestCase primavera in:

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

E qui è l'errore:

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]

Ho già provato a sovrascrivere e autowiring utilizzando qualificatori, es .:

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

E poi nel cablaggio testcase con

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

ma l'errore persiste.

due domande:

  1. Come può questo problema essere risolto con la configurazione di annotazione basato?
  2. Come posso eseguire i test SENZA autowiring e annotazioni?

risposta

2

Stai utilizzando i bean senza nomi in modo che Spring proverà a trovare un nome, questo nome potrebbe essere basato sull'annotazione @Component che presumibilmente hai nella tua classe, ma potrebbe anche essere la versione in cammello di il tuo nome di classe non qualificato del tuo bean (in entrambi i casi risulterebbero uguali e questo fa sì che Spring si opponga).

Inoltre, sembra che si stia mescolando la scansione dei componenti e la configurazione xml in un modo che mi sembra un po 'strano.

Ci sono molti modi per uscire da questo, ma nella maggior parte dei casi si dovrebbe usare solo un singolo fagiolo per implementare il contratto che si sta tentando di completare. Se avete bisogno di diverse implementazioni si dovrebbe dare loro nomi diversi e più discriptive:

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

questo vi darà la registrazione più utile, anche se i nomi di fagioli non sono mai utilizzati perché si basano sul cablaggio automatico.

+0

E ho portato avanti utilizzando @Autowired piuttosto che @Resource? –

+1

@Resource è meno flessibile di @Autowired. Userei solo se non è possibile avere una dipendenza primavera nella classe si sta cablaggio con esso, e se si sta utilizzando primavera per cablare EJB. il tuo banco di prova non ha commercio con esso, tanto più che le ultime versioni di Spring 3 supporto autowiring disambiguazione sulla corrispondenza nomi dei campi. – iwein

0

È possibile provare a inserire la dipendenza per nome utilizzando l'annotazione @Resource. Dovrai fornire nomi (id) ai bean o usare il valore predefinito, che è il nome della classe non qualificato incapitalizzato.

+0

Grazie per la risposta, tuttavia, ho provato ma non ha funzionato :-( –

+1

_how_ non ha funzionato? – Bozho

+0

Ho esattamente lo stesso errore. Per favore, aspetta un minuto, impaccherò tutta la fonte . codice e metterlo da qualche parte per il download ... –

0

L'ho installato e funzionante ora! Tuttavia, non credo che questa sia la migliore pratica. Ho semplicemente escluso il percorso dei DAO indesiderate scrivendo in appContext.xml:

<context:component-scan base-package="test"> 
     <context:exclude-filter type="regex" expression="test\.daohibernate.*"></context:exclude-filter> 
    </context:component-scan> 

Qualche suggerimento? Questo problema potrebbe essere correlato a http://jira.springframework.org/browse/SPR-4524?

1
  1. Fai ciò che Iwein ha suggerito: dai un nome alle tue classi di implementazione (ad es., HibernateUserDao e JpaUsererDao); oppure specificare un nome di bean univoco tramite l'annotazione @Component o @Repository nelle classi di implementazione UserDAO.
  2. Attualmente non è possibile eseguire i test senza autowiring. Vedere questo problema JIRA per i dettagli: https://jira.springsource.org/browse/SPR-6050

saluti,

Sam (autore del TestContext Spring Framework)

P.S. No, il problema che stai affrontando non è correlato a SPR-4524.

Problemi correlati