如何从XML和JavaConfig加载Spring ContextConfiguration

时间:2017-09-18 22:32:31

标签: spring-test

从我读过的Spring @ContextConfiguration注释中,可以加载多个XML上下文文件或多个JavaConfig类。我需要从一个XML上下文文件和一个类加载。我见过的所有例子都加载了所有XML或所有类,但不是两者都加载。

我试图这样做是因为我希望我的测试类(仅用于验证预期的Spring连接)加载我的默认applicationContext.xml文件(目前只是存储在" src /中的副本)测试/资源,并试图弄清楚如何直接指定默认值)以及指定一些需要可用的JNDI资源的JavaConfig类。出于测试的目的,我只需要将这些JNDI资源设置为虚拟字符串,但我真的想在内联静态类而不是外部XML文件中指定它们,因为我的测试将不得不验证某些设置是否与那些虚拟字符串相同,并且如果值和检查位于同一文件中,则更易于维护。

我到目前为止所做的以及我尝试过的内容可以用这个来说明:

@RunWith(SpringRunner.class)
@ContextConfiguration(value = {"/testApplicationContext.xml", "/testResources.xml"})
//@ContextHierarchy({
//    @ContextConfiguration("/testApplicationContext.xml"),
//    @ContextConfiguration(classes = SpringWiringTest.Config.class)
//})
@TestPropertySource(properties = { "env = tomcat", "doNotifications = false" })
public class SpringWiringTest {

这在课程结束时:

@Configuration
public static class Config {
    @Bean public String uslDatasourcesList() { return "abc"; }
    @Bean public String atgDatasourcesList() { return "abc"; }
    @Bean public String uslTableNamePrefixsList() { return "abc"; }
    @Bean public String atgTableNamePrefixsList() { return "abc"; }
    @Bean public String doNotifications() { return "false"; }
    @Bean public DataSource abc() { return new DriverManagerDataSource(); }
}

如果我注释掉第一个@ContextConfiguration并在@ContextHierarchy块中回复,我会收到如下错误:

  

使用name' uslDatasourcesList':init的调用创建bean时出错   方法失败;嵌套异常是   javax.naming.NoInitialContextException:需要在中指定类名   环境或系统属性,或作为applet参数,或在   应用程序资源文件:java.naming.factory.initial

更新

使用选择JavaConfig或XML作为"入口点"的指南配置,这里有一些修改过的摘录,显示了我正在尝试的内容:

@RunWith(SpringRunner.class)
@ContextConfiguration
//@ContextConfiguration(value = {"file:src/main/webapp/WEB-INF/applicationContext.xml", "/testResources.xml"})
@TestPropertySource(properties = { "env = tomcat", "doNotifications = false" })
public class SpringWiringTest {
    ...
    @BeforeClass
    public static void setup() throws Exception {
        SimpleNamingContextBuilder  builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
        DataSource  ds  = new DriverManagerDataSource();
        builder.bind("java:comp/env/abc", ds);
    }
    ...
    @Configuration
    @ImportResource("file:src/main/webapp/WEB-INF/applicationContext.xml")
    public static class Config {
        @Bean public String uslDatasourcesList() { return "abc"; }
        @Bean public String atgDatasourcesList() { return "abc"; }
        @Bean public String uslTableNamePrefixsList() { return "abc"; }
        @Bean public String atgTableNamePrefixsList() { return "abc"; }
        @Bean public String doNotifications() { return "false"; }
        @Bean public DataSource abc() { return new DriverManagerDataSource(); }
    }
}

当我进行测试时,底部"由"引起在例外中说:

  

引起:javax.naming.NameNotFoundException:名称   [uslDatasourcesList]没有绑定; 1个绑定:[java:comp / env / abc]

在备用版本中,使用已注释掉的" @ ContextConfiguration" (并注释掉Config类及其注释),不会发生此错误。

请注意,这是我的" testResources.xml"文件:

<bean id="uslDatasourcesList" class="java.lang.String"> <constructor-arg value="abc"/> </bean>
<bean id="atgDatasourcesList" class="java.lang.String"> <constructor-arg value="abc"/> </bean>
<bean id="uslTableNamePrefixList" class="java.lang.String"> <constructor-arg value="abc"/> </bean>
<bean id="atgTableNamePrefixList" class="java.lang.String"> <constructor-arg value="abc"/> </bean>
<bean id="doNotifications" class="java.lang.String"> <constructor-arg value="false"/> </bean>

<bean id="abc" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
</bean>

请注意错误消息中提到的bean,&#34; uslDatasourcesList&#34;在两个版本中定义,但它在JavaConfig和XML混合的版本中不起作用。

几乎可以看出&#34; @ ImportResource&#34;在将JavaConfig类中声明的bean合并到其中之前,将自行评估注释。

1 个答案:

答案 0 :(得分:0)

Spring参考手册中的Mixing XML, Groovy scripts, and annotated classes部分清楚地记录了这一点。

总之,......

  

...您必须选择一个作为切入点,并且必须包含或导入另一个。

因此,以下应该希望解决您的问题。

@RunWith(SpringRunner.class)
@ContextConfiguration
@TestPropertySource(properties = { "env = tomcat", "doNotifications = false" })
public class SpringWiringTest {

    // ...

    @Configuration
    @ImportResource({"/testApplicationContext.xml", "/testResources.xml"})
    static class Config {
        // ...
    }

}