Ответ 1
До 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
(и этот класс может быть даже в том же файле, что и ваш тестовый пример).