Frage

Ich möchte zwei verschiedene Implementierungen für ein DAO mit dem Testframework von Spring verwenden.

src.main.java

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

Der Frühlingstestfall 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 {}

Und hier ist der Fehler:

Verursacht durch:java.lang.IllegalStateException:Annotationsspezifizierte Bean-Name 'UserDao' für Bean-Klasse [jpadao.userdao] Konflikte mit vorhandenen, nicht kompatiblen Bean-Definition desselben Namens und der Klasse [jpaadao.userdao

Ich habe bereits versucht, die automatische Verdrahtung durch die Verwendung von Qualifizierern zu überschreiben, z. B.:

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

Und dann im Testfall die Verkabelung mit

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

aber der Fehler bleibt bestehen.

Zwei Fragen:

  1. Wie kann dieses Problem mit einer annotationsbasierten Konfiguration gelöst werden?
  2. Wie kann ich Tests durchführen? OHNE Autowiring und Anmerkungen?
War es hilfreich?

Lösung

Sie verwenden Bohnen ohne Namen, so dass der Frühling versucht, einen Namen zu finden, wobei dieser Name auf der @ -Component-Anmerkung basiert, die Sie vermutlich auf Ihrer Klasse haben, aber es könnte auch die kamelettierte Version Ihres seinDer unqualifizierte Klassenname Ihrer Bean (in beiden Fällen würden sie gleichermaßen auftreten, und das verursacht Frühling zu Objekt).

Außerdem scheint, dass Sie anscheinend das Scannen der Komponenten- und XML-Konfiguration in einer Weise mischen, die für mich ein bisschen seltsam aussieht.

Es gibt viele Möglichkeiten, aber die saubersten, aber Sie würden nur eine einzige Bohne verwenden, um den Vertrag umzusetzen, den Sie vollfilmen versuchen.Wenn Sie verschiedene Implementierungen benötigen, sollten Sie ihnen unterschiedliche und diskristische Namen geben:

generasacodicetagpre.

Hier gibt es mehr nützliche Protokollierungen, auch wenn die BAND-Namen niemals verwendet werden, weil Sie sich auf die automatische Verdrahtung verlassen.

Andere Tipps

    .
  1. tun, was iwein vorschlug: Nennen Sie Ihre Implementierungsklassen besser (z. B. Hibernateuserdao und jpauserdao);Oder geben Sie einen einzigartigen Bean-Namen über die @component oder @Repository-Anmerkung in Ihren UserDao-Implementierungsklassen an.
  2. Sie können die Tests derzeit nicht ohne autozwischen ausführen.Sehen Sie dieses JIRA-Problem für Details: https://jira.springsource.org/browse/spr-6050
  3. grüße,

    sam (Autor des Spring Testcontext Framework)

    p.s.Nein, das Problem, das Sie gegenüberstehen, ist nicht mit SPF-4524 verbunden.

Sie können versuchen, die Abhängigkeit namentlich mithilfe von einzufügen @Resource Anmerkung.Sie müssen den Beans Namen (IDs) geben oder den Standardwert verwenden, bei dem es sich um den nicht großgeschriebenen, nicht qualifizierten Klassennamen handelt.

Ich habe es jetzt aufgeholt und läuft jetzt!Ich glaube jedoch nicht, dass dies die beste Praxis ist.Ich habe den Pfad der unerwünschten Daos einfach ausgeschlossen, indem ich in appcontext.xml schreibt:

generasacodicetagpre.

Alle Vorschläge?Könnte dieses Problem mit http://jira.springframework.org/browse/spr-4524

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top