領先一步
VMware 提供培訓和認證,以加速您的進步。
瞭解更多在 Spring 上下文中對某些類進行單元測試時,我最惱火的事情之一就是使用所有依賴項初始化它們。 對於 Spring 框架擴充套件(如 FactoryBean 實現或 *Aware 實現)尤其如此。 新增所有依賴項很麻煩,並且很容易忘記呼叫 bean 生命週期方法,例如 InitializingBean 中的 afterPropertiesSet 方法。
用於單元測試的 Spring 基類提供了很大幫助,但仍然有一些事情很繁瑣。 例如,在許多情況下,有必要消除自動裝配的歧義,以便協作者獲得正確的實現。 此外,要從生命週期執行中受益,您必須從當前配置中測試 bean 例項,這並不總是方便的。
我一直在使用一個簡單的工具來簡化單元測試中協作者的設定,我想我會和一些人分享它。 它提供了一個 bean 初始化器,可用於連線現有 bean 上的依賴項。
BeanInitializer 初始化一個 bean,新增依賴項,並在一個方法中執行生命週期回撥
public class InitializingTests extends TestCase {
private Collaborator collaborator;
public void setUp throws Exception {
super.setUp();
collaborator = new SimpleCollaborator();
}
public void testBeanWithSimpleDependencyOnThis() throws Exception {
Service bean = BeanInitializer.initialize(new ServiceImpl(), this);
assertNotNull(bean.getCollaborator());
}
}
BeanInitializer.initialize 方法的引數是要初始化的 bean,以及要設定在其上的屬性源,在此示例中為單元測試本身。 從 InitializingBean、BeanNameAware 等的生命週期回撥在返回 bean 之前被呼叫。 這很有用,因為可以新增或刪除生命週期介面,而無需更改單元測試。
你也可以這樣做
Service bean = BeanInitializer.initialize(new ServiceImpl(), new Collaborator());
或者這樣做
Service bean = BeanInitializer.initialize(new ServiceImpl(), new
Object[] { new Collaborator(), "valueOfOnlyStringProperty" } );
或者這樣做(例如,在使用 spring-mock 基類的單元測試中)
Service bean = BeanInitializer.initialize(new ServiceImpl(),
new Collaborator(), applicationContext );
在最後一種情況下,顯式協作者會覆蓋 applicationContext 中具有相同介面的任何值,因此自動裝配是明確的。 這非常適合新增複雜服務類的模擬實現,其中應用程式上下文已經包含“真實”實現。 請記住,Spring 單元測試基類會快取應用程式上下文例項,因此這可能是提高單元測試效率的絕佳方法。
如果您有興趣,我已經上傳了程式碼(here) - 它非常簡單,但非常有用,希望如此。