2013-10-21 31 views
2

在我的應用程序正在使用FactoryModuleBuilder自動創建某些類的實例:讓Guice的FactoryModuleBuilder創建一個返回模擬的工廠?

new AbstractModule() { 
    @Override 
    protected void configure() { 
    install(new FactoryModuleBuilder().implement(A.class,B.class).build(A.AFactory.class)); 
    } 
}); 

在我的測試我真的不希望使用的實現(B類),所以我想配置模塊因此工廠將返回一個模擬的Mockito這樣的:

new AbstractModule() { 
    @Override 
    protected void configure() { 
    install(new FactoryModuleBuilder().implement(A.class,myMockInstance).build(A.AFactory.class)); 
    } 
}); 

顯然上面沒有任何意義,因爲實行()告訴它的實現是應該用於接口A,但我希望它得到跨我的觀點我想創建的工廠使用我的模擬對象。然後,我可以用我的模擬像往常一樣:

Mockito.when(myMockInstance.doStuff()).thenReturn(result); 

這是可能的,或者我需要手動創建一個C類實現,這將作爲一個模擬的?

回答

5

爲什麼要使用FactoryModuleBuilder?它的存在是將@Assisted參數A.AFactory的參數自動處理爲B的構造函數,但是在一個測試中你不需要這個參數 - 特別是當工廠返回一個模擬的時候。相反,嘲笑你自己A.AFactory,並通過Guice使其可訪問。

final A myMockInstance = createAMock(); 
new AbstractModule() { 
    @Override protected void configure() {} 

    @Provides 
    A.AFactory createAFactory() { 
    A.AFactory factory = mock(A.AFactory.class); 
    when(factory.createA(anyString(), anyInt(), any(Dependency.class))) 
     .thenReturn(myMockInstance); 
    return factory; 
    } 
}); 

我在這裏使用一個@Provides方法,但你可以很容易地只寫你自己的五線命名A.AFactory而不是使用bind(A.AFactory.class).to(AFactoryForTest.class)綁定,或設置你的模擬工廠其他地方bind(A.AFactory.class).toInstance(myMockInstance);

+0

是啊,我就是這麼想的,但缺少Guice的技巧,謝謝:-) –

相關問題