我還沒有找到任何關於如何做到這一點的例子。我假設基於這樣的示例是不可能的:是否可以使用AndroidAnnotations注入模擬測試用於測試目的?
@Bean(MyImplementation.class)
MyInterface myInterface;
其中要注入的類已經確定。
我還沒有找到任何關於如何做到這一點的例子。我假設基於這樣的示例是不可能的:是否可以使用AndroidAnnotations注入模擬測試用於測試目的?
@Bean(MyImplementation.class)
MyInterface myInterface;
其中要注入的類已經確定。
問題是,你是單元測試還是集成測試?
如果你是單元測試,我會建議使用模擬老式的方式,通過使用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引入到應用程序的注入依賴樹中。
謝謝。我已經開始使用Robolectric進行單元測試。在上面給出的例子中,你是否說在測試方法中調用我的類的構造函數以便在測試期間繞過AndroidAnnotation? – apollodude217
調用構造函數(包含Robolectic)只會爲您提供一個活動的實例。我不會說這會繞過AndroidAnnotaions。但是,如果你測試你的類「MyActivity」(vs「MyActivity_」),那麼你將不會有生成的代碼負責AA的DI。 –
的補充,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。有趣的是,你建議測試生成的活動(p.2)。我想活動有足夠的變化來保證這種方法。 –
這就是我的觀點:) –
@Piwaï我不確定上述嘲諷方法是如何工作的。如果您有任何使用AfterViews註釋的方法,它們將作爲活動創建的一部分執行。如果這些方法有任何依賴關係,它們將會失敗 - 因爲你還沒有機會嘲笑它們。有關如何解決此問題的任何想法? – Neil
您是否在考慮測試您的班級或AndroidAnnotations生成的班級? –
我想測試一個我寫的類。我想將模擬注入到爲測試代碼編寫的類中,併爲生產注入「真實」對象。 – apollodude217