从我读过的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合并到其中之前,将自行评估注释。
答案 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 {
// ...
}
}