2017-02-09 67 views
1

我試圖運行mvn integration-test階段,並且在執行集成測試(單元測試得到正確執行)時出現Failed to load ApplicationContext錯誤。我正在使用SpringJUnit4ClassRunner類運行我的測試。運行集成測試時未能加載ApplicationContext

這是一個完整的堆棧跟蹤:

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 

另外,我使用的原型,你可以看到註釋Configurationhere。我究竟做錯了什麼?

這是我的測試類:

@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:我起訴Maven的故障安全爲integration-test目標和神火POR的test目標。

+0

您是否正在運行your're配置完全java驅動或者您是否還有ApplicationContext.xml? –

+0

你也可以顯示你的相關測試班'AccountServiceIT'嗎? – Morfic

+0

嗨@ T.Jung我只使用Java配置。 –

回答

2

您在測試中缺少@ContextConfiguration(classes = ...)批註環境的定義。由於classes您可能會定義單個配置或您的整個生產應用程序上下文(包括所有其他)。聲明你需要的配置類的好處是整個測試的引導速度更快。

注意:Spring測試會緩存指定的應用程序上下文。如果必須在整個配置中運行9/10測試,則會比聲明一組新的上下文配置需要更少的時間來使用整個配置。但是您應該爲您的集成測試獲得小的配置佔用空間,以便您可以專注於正在工作的域切片,而無需處理或維護其他上下文配置。

通常測試運行SpringJUnit4ClassRunner希望有一個應用程序上下文運行。 延伸閱讀:Link to the spring docs

+0

嗨!我嘗試使用'@ContextConfiguration(classes = Application.class)'註釋測試類,並且它不工作。如果我使用'WebSecurityConfigurationAware'擴展測試類,可以正常工作,但我不明白爲什麼和我不能找到任何信息.. –

+0

你的意思是某種這種https://github.com/kolorobot/spring-mvc-quickstart-archetype/blob/master/src/main/resources/archetype-resources/src/test/ java/config/WebSecurityConfigurationAware.java(谷歌搜索)。所以你正在使用彈簧安全?如果你包含了整個應用程序(如上所述),你還必須使用'.addFilters(springSecurityFilterChain)'進行正確的設置(鏈必須被自動裝入/注入)。 – meistermeier

+0

嗨,這是工作,謝謝!但爲什麼我需要爲Spring安全鏈添加一個過濾器? –

相關問題