2017-02-09 70 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安全链添加一个过滤器? –

相关问题