BeanInitializer:在單元測試中連線依賴項

工程 | Dave Syer | 2007 年 4 月 2 日 | ...

在 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) - 它非常簡單,但非常有用,希望如此。

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進步。

瞭解更多

獲取支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部