2014-07-24 66 views
1

我遇到了一個特殊的情況。我使用SpringJunit4Runner來運行一些集成測試。我在測試中使用@ContextConfiguration標籤。即使<context:annotation-config>缺失,Spring @ Autowired也不會失敗

可以說我有這樣的

public ClassUnderTest { 
    @Autowired 
    SomeDependency someClass; 
} 

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

    @Autowired 
    ClassUnderTest classUnderTest; 

} 

我想,如果自動裝配SomeDependency失敗,這FAILFAST類。順便說一下,我忘了在我的applicationContext.xml中添加
<context:annotation-config/>行。沒有<context:component-scan/>
我所期望的是春季測試失敗。但事實並非如此。它通過愉快,我發現在部署到容器過程中的錯誤。

這是爲什麼?我從文檔中看到它使用'SmartContextLoader',也許默認情況下默認啓用Annotation支持。但它不應該。
我錯過了什麼嗎?我怎樣才能使這個測試failfast?

+1

不錯的閱讀[這裏](http://spring.io/blog/2011/06/21/spring-3-1-m2-testing-with-configuration-classes-and-profiles/) –

+0

嗯,你不需要對此進行測試,因爲註解'@ Autowired'具有'required'屬性,它默認爲'true',所以如果它沒有自動裝配,你將無法加載應用程序上下文 – Jaiwo99

+0

@ Jaiwo99'required '只有在解釋'@ Autowired'註釋時纔會啓動,因爲我忘記了在applicationcontext.xml中啓用註釋 – Devu

回答

0

我相信this是解釋您看到的這種行爲的相關文檔。引用如下:

下面的標註支持Spring TestContext框架的所有配置的標準語義。請注意,這些註釋並非特定於測試,可以在Spring框架的任何地方使用。

* @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的List。在默認偵聽器列表中有一個 - DependencyInjectionTestExecutionListener - 它的injectDependencies方法將使用AutowireCapableBeanFactory自動調用測試實例的屬性。相關的一段代碼是here

+0

也許我對我的問題措辭不好。我質疑這個設計。如果你正在編寫一個測試,並且由於測試涉及自動裝配,可以認爲它是一個集成測試而不是單元測試,如果與自動裝配有關的任何失敗都會失敗。實際上,我正在測試我的彈簧配置。因此,如果測試通過且代碼在部署期間失敗,我會感到很驚訝。我會希望測試失敗,作爲我錯過了一些事情的早期預警。 – Devu

相關問題