8

我還沒有找到任何關於如何做到這一點的例子。我假設基於這樣的示例是不可能的:是否可以使用AndroidAnnotations注入模擬測試用於測試目的?

@Bean(MyImplementation.class) 
MyInterface myInterface; 

其中要注入的類已經確定。

+0

您是否在考慮測試您的班級或AndroidAnnotations生成的班級? –

+0

我想測試一個我寫的類。我想將模擬注入到爲測試代碼編寫的類中,併爲生產注入「真實」對象。 – apollodude217

回答

6

問題是,你是單元測試還是集成測試?

如果你是單元測試,我會建議使用模擬老式的方式,通過使用setter並嘗試測試Java代碼而不涉及依賴注入框架。這將孤立地測試你的班級,並避免了很多複雜性。

我的意思:

public class Test{ 

    ClassInTest inTest; 
    MyInterface myInterface; 

    @Before 
    public void setup(){ 
     inTest = new ClassInTest(); 
     //or your favorite mocking frameowrk 
     myInterface = EasyMock.createMock(MyInterface.class); 
     inTest.setMyInterface(myInterface); 
    } 

    @Test 
    public void testMethod(){ 
     //...mocking test code 
    } 
} 

當然,Android的測試活動(和Android的其他擴展),是因爲異常拋出存根和最終的類/方法的困難。這是Robolectric派上用場(強烈推薦)用於實例化/映射Android API的地方。

如果您正在進行集成測試,您可能需要採取另一種方法。就個人而言,我會盡量不要在集成測試期間模擬,因爲我試圖在生產環境中測試應用程序。但是,如果你真的想嘲笑,你可以使用類似的方法來進行單元測試,並在你站起來生成Activity類後引入一個模擬。值得注意的是,您可以使用框架如Robotium直接在硬件上執行集成測試。

更多關於你的問題,我不知道有任何AndroidAnnotations的工具專門用於注入Mock或將Mocks引入到應用程序的注入依賴樹中。

+0

謝謝。我已經開始使用Robolectric進行單元測試。在上面給出的例子中,你是否說在測試方法中調用我的類的構造函數以便在測試期間繞過AndroidAnnotation? – apollodude217

+1

調用構造函數(包含Robolectic)只會爲您提供一個活動的實例。我不會說這會繞過AndroidAnnotaions。但是,如果你測試你的類「MyActivity」(vs「MyActivity_」),那麼你將不會有生成的代碼負責AA的DI。 –

8

的補充,johncarl答案:

  • 有沒有辦法告訴你要注入嘲笑,而不是實物AndroidAnnotations,因爲它工作在編譯時,因此代碼必須始終生產準備。

  • 我會建議測試生成的活動,補充Robolectric。註釋正在向您的代碼添加行爲,因此您不應該對其進行測試,就好像沒有註釋一樣。

  • 請小心測試您的活動行爲,而不是AndroidAnnotations的行爲。該框架已經有自己的測試來檢查註釋是否正常工作:)。

  • 您可以讓AndroidAnnotations DI發生,然後重新注入模擬的依賴關係。這些字段至少具有默認範圍,這意味着它們可以從相同的包中訪問,所以您必須在與活動相同的包中創建測試。

    MyActivity_ activity = new MyActivity_(); 
    
    // myInterface gets injected 
    activity.onCreate(null); 
    
    // you reinject myInterface 
    activity.myInterface = Mockito.mock(MyInterface.class); 
    
  • 在AndroidAnnotations,依賴是通過調用MyImplementation_.getInstance_()注入。您可以使用工具(如PowerMock)的工具使用運行時字節碼操作來讓方法MyImplementation_返回一個模擬。這可能需要一些初始工作,因爲你必須混合使用PowerMock測試運行器和Robolectric測試運行器。

編輯:我更新了documentation與內容基於這個問題。

+1

+1。有趣的是,你建議測試生成的活動(p.2)。我想活動有足夠的變化來保證這種方法。 –

+0

這就是我的觀點:) –

+1

@Piwaï我不確定上述嘲諷方法是如何工作的。如果您有任何使用AfterViews註釋的方法,它們將作爲活動創建的一部分執行。如果這些方法有任何依賴關係,它們將會失敗 - 因爲你還沒有機會嘲笑它們。有關如何解決此問題的任何想法? – Neil

相關問題