JUnit-runner custom mit Spring application context

Ich bin Recht neu auf Frühling und arbeite mit einer suite von JUnit 4.7 integration tests für eine web-Anwendung. Ich habe eine Reihe von arbeiten von Testfällen der form:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/META-INF/spring/testContext.xml" })

public class myTest {
    @Test
    public void testCreate() {
            //execute tests
            ....
    }
}

Meine Anwendung hat eine Reihe von externen Abhängigkeiten, dass ich die Prüfung, die Bohnen, die initialisiert werden, durch das laden von testContext.xml. Einige dieser externen Abhängigkeiten erfordern benutzerdefinierte code zum initialisieren und reißen Sie die notwendigen Ressourcen.

Anstatt duplizieren Sie diesen code in jede test-Klasse, die es erfordert, würde ich mag, um es zu Kapseln, die in einem gemeinsamen Ort. Mein Gedanke war, erstellen Sie einen separaten Kontext, definition sowie eine benutzerdefinierte Läufer, erstreckt sich SpringJUnit4ClassRunner und @enthält ContextConfiguration annotation und Verwandte, die benutzerdefinierten code, zum Beispiel so:

import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

//load the context applicable to this runner
@ContextConfiguration(locations = { "/META-INF/spring/testContext.xml" })

public class MyCustomRunner extends SpringJUnit4ClassRunner {

    public MyCustomRunner(Class<?> clazz) throws InitializationError {
        super(clazz);           
    }

    @Override
    protected Statement withBeforeClasses(Statement statement) {
        //custom initialization code for resources loaded by testContext.xml
                ...

        return super.withBeforeClasses(statement);
    }

    @Override
    protected Statement withAfterClasses(Statement statement) {
        //custom cleanup code for resources loaded by testContext.xml
                ....

        return super.withAfterClasses(statement);
    }

}

Konnte ich dann jede test-Klasse festlegen, seine für Läufer mit:

@RunWith(MyCustomRunner)

Wenn ich das Tue, meine tests laufen und die richtige withBeforeClasses und withAfterClasses Methoden ausgeführt werden. Allerdings keine Datei ApplicationContext wird bereitgestellt, um die test-Klasse und alle meine versuche scheitern mit:

java.lang.IllegalArgumentException:
Kann nicht laden Sie eine Datei ApplicationContext
mit einer NULL 'contextLoader'. Betrachten
Anmerkungen zu Ihrem test-Klasse mit
@ContextConfiguration.

Kontext nur eine Menge richtig, wenn ich geben Sie die @ContextConfiguration-Anmerkung für jede test-Klasse - im Idealfall würde ich gerne diesen Kommentar zu Leben mit dem handler-code für die Ressourcen, die er für die Beladung verantwortlich. Das führt mich zu meiner Frage - ist es möglich die Last Spring context Informationen, die von einer eigenen Läufer-Klasse?

InformationsquelleAutor DrewCo | 2011-04-20
Schreibe einen Kommentar