RunWith和ContextConfiguration的奇怪行为

9

我有一个非常简单的类:

 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration(locations={"classpath*:/application-context-this-does-not-exist.xml"})
  public class HTMLSourceExtractorImplTest {

    @Autowired
    ApplicationContext context;

    @Test
    public void test(){
         String [] beans = context.getBeanDefinitionNames();
             for(String bean : beans){
                 System.out.println(bean);
             }
         System.out.println("Testing");
    }
}

在类路径中指定的上下文文件不存在。我可以随便起任何名字,代码不会出错。我的意思是测试运行得很好,就像该文件真的存在一样。
如果我进行一个小改变,从:classpath* 到 classpath,那么它会崩溃,并说这个文件不存在,这是我在第一种情况下也期望的行为。
Spring 版本 3.2.3.RELEASE。
有人能解释这种奇怪的行为吗?
编辑
建议从日志中获取以下信息:
     20:47:26,923 INFO  [GenericApplicationContext] Refreshing org.springframework.context.support.GenericApplicationContext@3df6c65c: startup date [Fri Jun 07 20:47:26 PDT 2013]; root of context hierarchy

我甚至尝试从应用程序上下文中输出所有的bean:
  org.springframework.context.annotation.internalConfigurationAnnotationProcessor
  org.springframework.context.annotation.internalAutowiredAnnotationProcessor
  org.springframework.context.annotation.internalRequiredAnnotationProcessor
  org.springframework.context.annotation.internalCommonAnnotationProcessor                   
  org.springframework.context.annotation.ConfigurationClassProcessor.importAwareProcessor

我认为,在使用通配符的情况下,Spring会创建一个默认的空应用程序上下文。

1个回答

20

来自JavaDoc的引用可能会回答您的问题:

/**
 * Pseudo URL prefix for all matching resources from the class path: "classpath*:"
 * This differs from ResourceLoader's classpath URL prefix in that it
 * retrieves all matching resources for a given name (e.g. "/beans.xml"),
 * for example in the root of all deployed JAR files.
 * @see org.springframework.core.io.ResourceLoader#CLASSPATH_URL_PREFIX
 */
String CLASSPATH_ALL_URL_PREFIX = "classpath*:";

由于您的类路径中没有与名称application-context-this-does-not-exist.xml匹配的XML文件,因此您的配置等同于@ContextConfiguration(locations={}) => 空应用程序上下文

但是,当您使用CLASSPATH_URL_PREFIX =“classpath:”时,这相当于说“加载此不存在的文件”=> 错误加载上下文配置


我真的没有看到你提供的文档和默认应用程序上下文之间的任何联系。显然确实创建了一个空上下文,但是文档并没有清楚地说明这一点。谢谢你的回答。虽然会为你的努力点赞,但我希望文档中有一个明显的声明。 - Eugene
1
我已经描述过了 - 没有要加载的XML,你只剩下一个空上下文。 - Pavel Horal
你肯定做了,毫无疑问。但是从我运行的代码中很明显。不冒犯,但对我来说,代码应该会出错而不是通过。除非我得到更好的解释,否则我稍后会接受这个结果。谢谢你的时间! - Eugene
2
为什么会出现这种问题?因为它没有任何配置文件可以加载吗?classpath*: 是一个通配符前缀,作为搜索过滤器,而不是确定的位置。 - Pavel Horal
搜索过滤器,没有找到任何内容。这可能会引发很多争议,至少在我和你之间 :) - Eugene
3
我不明白你在哪里看到问题...那里没有任何问题。SpringJUnit4ClassRunner 总是创建一个基本的应用程序上下文,然后将其与基于 @ContextConfiguration 注释参数加载的所有配置合并。您提供的参数导致未加载任何配置,因此得到了空的上下文。 - Pavel Horal

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