2011-10-16 66 views
1

當我使用EasyMock和Guice框架編寫測試時,遇到問題。該代碼是這樣的:模擬框架在單元測試中與依賴注入框架一起工作

class A { 
    B b; 

    @Inject 
    public A(B b) { 
     this.b = b; 
     this.b.addListener(this); 
    } 
} 

class ATest { 
    @Inject 
    A a; 

    B b; 

    class InjectionModule extends AbstractModule { 
     protected void configure() { 
      b = createMock(B.class); 
      bind(B.class).toInstance(b); 
     } 
    } 

    public void setUp() { 
     createInjector(new InjectionModule()).injectMembers(this); 
    } 

    public void testSomething() { 
     replay(b); 
     a.doSomething(); 
     verify(b); 
    } 
} 

ATest,我替換B實施與模擬對象。但是當注入器創建A的一個實例時,在A的構造函數中調用B.addListener(),不幸的是,即使我從不期望它,這個調用也會被EasyMock記錄下來。

因此,我的問題是EasyMock期望我在ATest的每個測試用例中調用B.addListener()。請給我任何建議來克服這一點。謝謝。

+0

最後,我放棄了模擬框架。經過一週的工作,我使用繼承來模擬類,並用DI框架替換測試Taret的實現。現在我的單元測試很容易寫,也更清晰。 我相信DI框架的理念適合於單元測試,它可以幫助我優雅地替換測試對象的實現。另一方面,模擬框架在單元測試時幫助我,但它不像mockito那麼強大,並且有很多限制。 – papalagi

+0

當DI和模擬框架無法一起工作時,我決定放棄模擬框架。也許其他人發現有用的時候只使用模擬框架。 – papalagi

回答

3

我認爲問題在於你正在嘗試使用DI框架來單元測試一個類(這總是很痛苦)。

爲什麼不自己實例化一個A,並在這個過程中刪除8行代碼?

+1

因爲您可以經常使用DI框架來簡化更大代碼庫的模擬過程。 –