无法处理上下文配置的位置和类

时间:2015-01-16 08:19:17

标签: java testing junit configuration spring-test

我写过以下测试:

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

我需要在调用

时使用xml文件和java class bur中的配置

mvn test我在控制台中看到了以下内容:

Tests in error: 
  initializationError(***.CityDaoImplTest): Cannot process locations AND classes for context configuration [ContextConfigurationAttributes@5bb21b69 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.

如何在不重写配置的情况下修复它?

2 个答案:

答案 0 :(得分:37)

来自Spring Docs

  

在Spring 3.1之前,仅支持基于路径的资源位置。从Spring 3.1开始,上下文加载器可以选择支持基于路径的基于类的资源。从Spring 4.0.4开始,上下文加载器可以选择同时支持基于路径的基于类的资源。

然而,通过弹簧测试,有一个小警告。它使用基于SmartContextLoader的{​​{1}},不幸的是它并不那么聪明;)

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 { ... } 类(该类甚至可以在同一个文件中你的测试用例)。

答案 1 :(得分:1)

即使你迟到了,我也会发布我的答案,只是为了帮助其他人阅读本文。

另一个解决方案是在DataContext.xml中将Configuration类声明为bean。

您需要做的就是:

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

希望它会帮助某人;)