2017-02-09 12 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 

Кроме того, я использую архетип, вы можете увидеть аннотированные Configuration классы here. Что я делаю не так?

Это мой тест класс:

@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

Вы управляете своей конфигурацией полностью java-ведомой или у вас все еще есть ApplicationContext.xml? –

+0

Также вы можете показать свой соответствующий тестовый класс 'AccountServiceIT'? – Morfic

+0

Привет @ T.Jung Я использую только конфигурацию Java. –

ответ

2

Вы не указали определение контекста с аннотацией @ContextConfiguration(classes = ...) в своем тесте. В качестве classes вы можете определить одну конфигурацию (ы) или весь контекст производственного приложения (включая все остальные). Преимущество объявления только классов конфигурации, в которых вы нуждаетесь, заключается в том, что весь процесс начальной загрузки для теста выполняется быстрее.

Примечание. Весенние тесты кэшируют указанный им контекст приложения. Если вам нужно запустить 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 (поиск google). Значит, вы используете весеннюю безопасность? Если вы включите все приложение (как указано выше), вы также должны сделать правильную настройку с помощью '.addFilters (springSecurityFilterChain)' (цепочка должна быть автоматически добавлена ​​/ добавлена). – meistermeier

+0

Привет, это работает, спасибо! Но почему мне нужно добавить фильтр в цепочку безопасности Spring? –

Смежные вопросы