Невозможно обработать местоположения и классы для конфигурации контекста

Я написал следующий тест:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:META-INF/dataContext.xml"},classes = Configiuration.class)
@ActiveProfiles("test")
public class CityDaoImplTest {
....
}

Мне нужно использовать конфигурацию из xml файла и из класса java-класса при вызове

mvn test Я вижу следующее в консоли:

Tests in error: 
  initializationError(***.CityDaoImplTest): Cannot process locations AND classes for context configuration [[email protected] declaringClass = '***.CityDaoImplTest', classes = '{***.Configiuration}', locations = '{classpath:META-INF/dataContext.xml}', inheritLocations = true, initializers = '{}', inheritInitializers = true, name = [null], contextLoaderClass = 'org.springframework.test.context.ContextLoader']; configure one or the other, but not both.

Как исправить это, не переписывая конфигурацию?

Ответ 1

В Spring Документах:

До Spring 3.1 поддерживались только местоположения ресурсов на основе путей. Начиная с Spring 3.1, загрузчики контекста могут выбирать поддержку как на основе пути, так и на основе классов. Начиная с Spring 4.0.4, загрузчики контекста могут одновременно поддерживать ресурсы на основе пути и на основе классов.

Однако, при spring -test существует небольшое оговорка. Он использует SmartContextLoader, который основан на AbstractDelegatingSmartContextLoader и, к сожалению, он не настолько умный;)

@Override
public void processContextConfiguration(
        final ContextConfigurationAttributes configAttributes) {

    Assert.notNull(configAttributes, "configAttributes must not be null");
    Assert.isTrue(!(configAttributes.hasLocations() && configAttributes.hasClasses()), String.format(
        "Cannot process locations AND classes for context "
                + "configuration %s; configure one or the other, but not both.", configAttributes));

Как показано в коде, местоположения и классы не могут быть установлены.

Итак, как это исправить? Ну, одним из решений является добавление дополнительного конфигурационного класса, такого как:

@Configuration
@ImportResource("classpath:META-INF/dataContext.xml")
class TestConfig {

}

И в вашем тестовом коде используйте следующее:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Configuration.class, TestConfig.class})
@ActiveProfiles("test")
public class CityDaoImplTest { ... }

Технически это переписывает конфигурацию, но вам не нужно изменять существующую конфигурацию, просто добавьте новый класс @Configuration (и этот класс может быть даже в том же файле, что и ваш тестовый пример).

Ответ 2

Даже если вам будет поздно, я отправлю свой ответ, чтобы помочь другим, которые прочтут это.

Другим решением является объявление класса Configuuration как bean в dataContext.xml.

Все, что вам нужно сделать, это:

<bean class="com.packageWhereConfigClassIsPresent.Configuration"/>

Надеюсь, это поможет кому-то;)