2017-02-09 7 views
1

Ich versuche, die mvn integration-test Phase auszuführen, und ich bekomme Failed to load ApplicationContext Fehler, wenn die Integration Tests ausgeführt werden (die Komponententests werden korrekt ausgeführt). Ich führe meine Tests mit der Klasse SpringJUnit4ClassRunner mit.Fehler beim Laden von ApplicationContext beim Ausführen von Integrationstests

Dies ist der vollständige Stack-Trace:

2017-02-09 03:22:15.705 [main] ERROR o.s.t.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframewor[email protected]5c072e3f] to prepare test instance [[email protected]] 
java.lang.IllegalStateException: Failed to load ApplicationContext 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) 
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117) 
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: java.lang.IllegalStateException: Neither GenericXmlContextLoader nor AnnotationConfigContextLoader was able to load an ApplicationContext from [[email protected] testClass = AccountServiceIT, locations = '{}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextCustomizers = set[[empty]], contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]. 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:263) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) 
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) 
    ... 25 common frames omitted 

Auch ich bin ein Urbild verwenden, können Sie die kommentierten Configuration Klassen here sehen. Was mache ich falsch?

Dies ist mein Test-Klasse:

@RunWith(SpringJUnit4ClassRunner.class) 
@Transactional 
public class PatientServiceIT { 

    private static final String EMAIL = "[email protected]"; 
    private static final String NAME = "test"; 
    private static final String SURNAMES = "account"; 
    private static final String PASSWORD = "testaccount"; 
    private static final String POSTAL_CODE = "15002"; 
    private static final String MOBILE_NUMBER = "694749217"; 

    @Autowired 
    private AccountRepository accountRepository; 

    @Autowired 
    private PatientRepository patientRepository; 

    @Autowired 
    private PatientService patientService; 

    private PatientDetails createPatientDetails() { 
     return new PatientDetails(EMAIL, PASSWORD, NAME, SURNAMES, MOBILE_NUMBER, POSTAL_CODE); 
    } 

    private Account createPatient() { 
     Account patientAccount = new Account(EMAIL, PASSWORD, NAME, SURNAMES, Role.ROLE_DENTIST); 
     Patient patient = new Patient(POSTAL_CODE, MOBILE_NUMBER); 
     patientAccount.setPatient(patient); 
     return patientAccount; 
    } 

    @Test 
    public void savePatient() { 
     // call 
     Patient patient = patientService.save(createPatientDetails()); 

     // assert 
     assertEquals(patient.getAccount(), createPatient()); 
    } 

} 

PS: Ich bin verklagt Maven ausfallsicher für das integration-test Ziel und todsichere por des test Ziel.

+0

Laufen Sie Ihre Konfiguration vollständig java-gesteuert oder haben Sie noch eine ApplicationContext.xml? –

+0

Können Sie auch Ihre relevante Testklasse "AccountServiceIT" anzeigen? – Morfic

+0

Hi @ T.Jung Ich verwende nur Java-Konfiguration. –

Antwort

2

Ihnen fehlt die Definition des Kontexts mit der @ContextConfiguration(classes = ...) Annotation in Ihrem Test. Als classes können Sie einzelne Konfigurationen oder Ihren gesamten Produktionsanwendungskontext (der alle anderen enthält) definieren. Der Vorteil der Deklaration nur der Konfigurationsklassen, die Sie benötigen, ist, dass das gesamte Bootstrapping für den Test schneller ist.

Hinweis: Spring-Tests cachen ihren angegebenen Anwendungskontext. Wenn Sie 9/10 Tests mit der gesamten Konfiguration ausführen müssen, wird es weniger Zeit benötigen, die gesamte Konfiguration erneut zu verwenden, als eine neue Gruppe von Kontextkonfigurationen zu deklarieren. Sie sollten jedoch darauf achten, einen kleinen Konfigu- rationsfußabdruck für Ihre Integrationstests zu erhalten, damit Sie sich auf das Domänensegment konzentrieren können, in dem Sie arbeiten, und keine anderen Kontextkonfigurationen verwalten oder verwalten müssen.

In allgemeinen Tests, die mit SpringJUnit4ClassRunner ausgeführt werden, wird erwartet, dass ein Anwendungskontext zum Ausführen vorhanden ist. Weiterführende Literatur: Link to the spring docs

+0

aktualisiert Hallo! Ich habe versucht, die Testklasse mit '@ContextConfiguration (classes = Application.class)' annotieren und es funktioniert nicht .. Wenn ich die Test-Klasse mit 'WebSecurityConfigurationAware' erweitert, funktioniert das gut, aber ich verstehe nicht warum und ich kann nicht finden Sie alle Informationen dazu .. –

+0

Sie meinen, irgendeine Art von diesem https://github.com/kolorobot/spring-mvc-quickstart-archetype/blob/master/src/main/resources/archetype-resources/src/test/ Java/Config/WebSecurityConfigurationAware.java (Google-Suche). Also benutzen Sie Federsicherheit? Wenn Sie die gesamte Anwendung (wie oben erwähnt) einschließen, müssen Sie auch das richtige Setup mit '.addFilters (springSecurityFilterChain)' durchführen (die Kette muss autowired/injected sein). – meistermeier

+0

Hallo, das funktioniert, danke! Aber warum muss ich der Spring-Sicherheitskette einen Filter hinzufügen? –

Verwandte Themen