14 Stimmen

Wie erstellt man TestContext für Spring Test?

Ich habe eine relativ kleine Java-Bibliothek, die ein paar Dutzend Beans implementiert (keine Datenbank oder GUI). Ich habe eine Spring Bean-Konfigurationsdatei erstellt, die von anderen Java-Projekten verwendet wird, um meine Beans in ihr Material zu integrieren.

Ich versuche jetzt zum ersten Mal, Spring Test zu verwenden, um einige dieser Beans in meine Junit-Testklassen zu injizieren (anstatt sie einfach zu instanziieren).

Ich tue dies zum Teil, um Spring Test zu lernen und zum Teil, um die Tests zu zwingen, die gleiche Bean-Konfigurationsdatei zu verwenden, die ich für andere bereitstelle.

In der Spring-Dokumentation heißt es, dass ich einen Anwendungskontext mithilfe der Klasse "TestContext" erstellen muss, die mit Spring geliefert wird. Ich glaube, dies sollte in einer Spring-XML-Datei erfolgen, auf die ich über die @ContextConfiguration-Annotation in meiner Testklasse verweise.

@ContextConfiguration({"/test-applicationContext.xml"})

Es gibt jedoch keinen Hinweis darauf, was in die Datei geschrieben werden soll!

Wenn ich meine Tests in Eclipse ausführe, erscheint die Fehlermeldung "failed to load Application Context" .....

Aktualisierung:

Hier ist test-applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <description>Holds application context for testing of the domain module.</description>

    <!-- Imports the uuid generator bean definitions -->
    <import resource="resources/domain-uuid.xml"/>  
</beans>

Mein Projektverzeichnis sieht folgendermaßen aus:

domain/
   src/
      main/
         java/
         resources/
      test/
         java/
         resources/ (location of test-applicationContext.xml)

Nur zum Spaß habe ich auch versucht, von der mvn-Befehlszeile über "mvn clean test" zu bauen, und ich erhielt die folgenden Fehler, die mein echtes Problem sein kann:

package org.springframework.test.context does not exist

package org.springframework.test.context.junit4 does not exist

cannot find symbol
symbol: class ContextConfiguration
@ContextConfiguration({"/resources/test-applicationContext.xml"})

cannot find symbol
symbol: class SpringJUnit4ClassRunner
@RunWith(SpringJUnit4ClassRunner.class)

12voto

Was in die Kontextdatei der Anwendung aufgenommen werden soll. Das TestContext Framework ermöglicht die Wiederverwendung der App-Verdrahtung im Kontext Ihrer Integrationstests. Also zum größten Teil gibt es nichts Besonderes für Tests, die Sie in die Konfigurationsdateien Ihres Anwendungskontexts einfügen würden. Wenn Ihr Controller eine Service-Bean-Abhängigkeit in Ihrer App hat, dann wird er diese auch in Ihrem Integrationstest haben. Wenn Ihr DAO eine SessionFactory in Ihrer App hat, dann gilt das auch für Ihren Integrationstest. Auf diese Weise müssen Sie beim Schreiben von Integrationstests nicht alles noch einmal neu verdrahten. Sehr cool.

Ich sagte zum größten Teil Denn es gibt mindestens eine Ausnahme, die mir einfällt. Normalerweise verwendet Ihre Anwendung JNDI, um eine DataSource zu finden, aber bei einem Integrationstest (zumindest bei einem Integrationstest außerhalb des Containers) haben Sie normalerweise keine JNDI-Umgebung zur Verfügung. Daher sollten Sie normalerweise die Erstellung der DataSource-Beans in einer separaten Datei isolieren und eine JNDI-Version für Ihre Live-Anwendung und eine Nicht-JNDI-Version verwenden (z. B. einfach eine direkte BasicDataSource ) für Ihren Integrationstest. Hier ist ein Beispiel für den ersten Fall:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/myStoreDS" resource-ref="true"/>

und hier ist ein Beispiel für Letzteres:

<bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close"
    p:driverClassName="${dataSource.driverClassName}"
    p:url="${dataSource.url}"
    p:username="${dataSource.username}"
    p:password="${dataSource.password}" />

Diese werden in separaten Dateien gespeichert. Die erste könnte in beans-datasource.xml für die normale App-Nutzung und die zweite in beans-datasource-it.xml für Integrationstests. Die Konfiguration, die für die normale Nutzung der App und für Integrationstests gilt (d.h. in den meisten Fällen der Großteil der Bean-Konfiguration), sollte in einer oder mehreren gemeinsamen Konfigurationsdateien enthalten sein.

Außerdem wird mit Spring 3 eine neue jdbc Namespace, mit dem Sie eine eingebettete Datenbank erstellen können, wie eine HSQLDB-Datenbank oder eine Derby-Datenbank usw. Er sieht wie folgt aus:

<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:hsql/schema.sql" />
    <jdbc:script location="classpath:hsql/test-data.sql" />
</jdbc:embedded-database>

Dies würde die BasicDataSource config, wenn Sie diese verwenden möchten.

Warum der Fehler auftritt. Der Fehler, den Sie sehen, tritt auf, weil Ihr @ContextConfiguration Wert gibt implizit an, dass sich die Anwendungskontextdatei im Klassenpfad befinden sollte. WICHTIG! Entfernen Sie die /resources Stück. Das sind die Innereien von Maven; wenn es Ihr JAR oder WAR baut, kopiert es die Inhalt der resources Verzeichnis in Ihren Klassenpfad, nicht resources selbst. Das sollte helfen.

EDITAR:

Um die Fehler "kein Symbol gefunden" zu beheben, müssen Sie Ihre Test-Abhängigkeiten zu Ihrem Maven POM hinzufügen. Dies wird JUnit und auch das Spring Test Modul sein, beide mit <scope>test</scope> . Wenn Sie außerdem ein Mock-Framework wie Mockito verwenden, müssen Sie diese Abhängigkeit (mit Testbereich) ebenfalls zu Ihrem POM hinzufügen. Versuchen Sie das und berichten Sie bitte, was passiert.

0 Stimmen

Entschuldigung - ich verwende weder JNDI noch DAOs. Ich weiß nur nicht, wo ich den textContext erstellen kann! Sie sagen "app context file" - was ist das?

0 Stimmen

Die "App-Kontextdatei" ist einfach Ihre Spring-Konfigurations-XML-Datei. Diejenige, die ein <beans>-Element auf oberster Ebene hat. Sie können sie direkt unter WEB-INF ablegen, oder Sie können sie auf dem Klassenpfad ablegen, z. B. unter src/test/resource, wie Sie in einem Ihrer anderen Kommentare sagten. Es könnte hilfreich sein, wenn Sie Ihre Verzeichnisstruktur (die relevanten Teile) zu Ihrem ursprünglichen Beitrag hinzufügen und auch zeigen, was Ihre Datei test-applicationContext.xml enthält.

1 Stimmen

OK - ich glaube, ich verstehe es. Ich muss nirgendwo TestContext angeben. Spring "weiß" einfach irgendwie (wie???). Das Problem ist, dass Spring meine Konfigurationsdatei nicht finden kann.

9voto

Espen Punkte 10195

Um es direkt unter src/test/resources zu finden, ändern Sie es in:

@ContextConfiguration({"classpath:/test-applicationContext.xml"})

Wenn Sie nichts angeben, dann sucht Spring im gleichen Paket wie die Testklasse.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X