即使<context:annotation-config>缺失,Spring @Autowired也不会失败</context:annotation-config>

时间:2014-07-24 14:33:02

标签: spring

我遇到了一个奇怪的情况。我使用SpringJunit4Runner来运行一些集成测试。我在测试本身使用@ContextConfiguration标记。

假设我有一个这样的课程

public ClassUnderTest {
    @Autowired
    SomeDependency someClass;
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public TestClass {

   @Autowired
   ClassUnderTest classUnderTest;

}

如果SomeDependency的自动装配失败,我希望这会失败。顺便说一下,我忘了添加行
我的applicationContext.xml中的<context:annotation-config/>。也没有<context:component-scan/> 我所期望的是弹簧未通过测试。但它并没有。它快乐地通过,我在部署到容器时发现错误。

为什么会这样?我从文档中看到它使用了一个&#39; SmartContextLoader&#39;也许默认情况下默认启用Annotation支持。但它不应该真的 我错过了什么吗?如何使此测试失败?

1 个答案:

答案 0 :(得分:0)

我相信this是解释您看到此行为的相关文档。引用如下:

  

对于Spring TestContext Framework的所有配置,标准语义支持以下注释。请注意,这些注释并非特定于测试,可以在Spring Framework中的任何位置使用。

* @Autowired
* @Qualifier
* @Resource (javax.annotation) if JSR-250 is present
* @Inject (javax.inject) if JSR-330 is present
* @Named (javax.inject) if JSR-330 is present
* @PersistenceContext (javax.persistence) if JPA is present
* @PersistenceUnit (javax.persistence) if JPA is present
* @Required
* @Transactional 

实际上在源代码中,经过挖掘:SpringJUnit4ClassRunner创建了一个TestContextManager,后者又定义了TestExecutionListener的列表。在默认侦听器列表中有一个 - DependencyInjectionTestExecutionListener - 在injectDependencies方法中将使用AutowireCapableBeanFactory自动装配测试实例的属性。相关的代码是here

相关问题