Spring上下文测试找不到配置文件位置。

8
我有一个大型应用程序,分布在多个Spring bean定义的xml文件中。在我的测试套件中,我使用FileSystemXmlApplicationContext手动加载所需的XML文件,以执行我想要运行的测试。这减少了测试设置时间,并允许我使用与生产中使用的完全相同的配置文件。
现在我正在尝试使用Spring的事务测试基类,它会获取配置位置并为我加载上下文。但出现问题,当应用程序上下文被创建时,Spring找不到任何配置文件。这很令人困惑,因为我从与使用FileSystemXmlApplicationContext加载配置时相同的工作目录运行测试。如果我在所有配置位置前加上“file:”,则可以找到我在测试中指定的路径,但是任何由配置中定义的bean引用或导入的文件(例如属性文件)都无法找到。怎么办?我能使扩展Spring上下文测试类的测试与我自己创建上下文的测试一样工作吗?
例如,像这样创建上下文是可以正常工作的:
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WEB-INF/services-context.xml"})

如果我扩展AbstractTransactionalDataSourceSpringContextTests,则以下内容无法找到services-context.xml:
@Override
protected String[] getConfigLocations() {
   return new String[] { "WEB-INF/services-context.xml"};
}

这会找到services-context,但是在那里定义的PropertyPlaceholderConfigurer无法找到它的属性文件。

 @Override
 protected String[] getConfigLocations() {
    return new String[] { "file:WEB-INF/services-context.xml"};
 }
6个回答

4
我们将所有的Spring配置和属性文件放在类路径下,这样可以保持简单 - 我们只需要从一个基类扩展我们的测试类,例如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
        "/spring/*.xml", 
        "/testSpring/*.xml" })
public abstract class AbstractIntegrationTest  {

这里的路径都是指类路径下的路径。

如果你不想这样做,你是否已经检查过你在services-context.xml文件中引用属性文件的方式?我猜想,如果你在上下文配置中添加了file:,那么你也需要将这个前缀添加到属性文件的引用中。或许你可以使用一个单独的测试Spring配置文件来改变你的属性占位符定义,并将它放在你的上下文文件列表的末尾 - 它的定义将会覆盖早期文件中定义的内容。


3

除了覆盖getConfigLocations之外,我还覆盖了loadContext并在其中使用了可靠的fileSystemXmlApplicationContext。

 @Override
 protected String[] getConfigLocations() {
     return new String[] { "WEB-INF/services-config.xml" };
 }

 @Override
 protected ConfigurableApplicationContext loadContext(String[] locations) throws Exception {
     return new FileSystemXmlApplicationContext(locations);
  }

1

您的配置位置是相对URI,并且将由基本测试类解释为此类URI,URI将相对于测试类本身的位置进行解析。尝试使用完全限定的URI,或者考虑测试类所在位置并使用相对URI。


在文件前面添加“file:”会强制使用限定的URI,但这会导致配置文件中引用的文件找不到的问题。 - Adam B

1

0
ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WebRoot/WEB-INF/services-context.xml"})

0
另一个可能的解决方案是复制 services-config.xml 并将其重命名为 services-config-test.xml,然后放置在类路径下。属性文件也是同样的做法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接