簡短的回答你的問題是,由於道路Robolectric的Android類轉換爲在JVM中執行代碼,很多自己的功能不表現爲你所期望的。許多系統回調將不會執行,並且您必須依賴Robolectric在其Shadow類實現中提供的內容。 (請參閱@Steven_BDawg提供的鏈接)。
長的答案:這是可能實現的一個大考驗這整個流程,但它不是什麼框架設計。
Robolectric和單元測試通常不會用於您描述的方式。指出可以將單元視爲應用程序中最小的可測試部分。單元測試套件應包含許多輕量級測試,每個測試都會隔離應用程序中的一些功能並確保其正常工作。
考慮包含兩個活動,A和B活性的A中的基本應用程序顯示有關主題的一些信息,和活動B允許用戶選擇在A.要顯示的主題當從活動A在用戶移動到活動B,B被撥打電話startActivityForResult()
,並且應該返回到所選主題的A。
現在說我們想要單元測試這個從A得到結果並顯示數據的流程。我們可把此成兩個測試:
- 活動在測試 - 在我們的測試活動A.,我們將創建活動A.在Robolectric測試的新實例,我們創建了我們預期B中的意圖返回到A,併爲A調用陰影方法
receiveResult()
,用結果代碼OK和此Intent填充參數。在receiveResult()
之後,運行您的斷言。您現在知道活動A正確處理結果!
- 活動在測試 - 活動B.在我們的測試中,我們將創建活動B的新實例,設置它,就好像它是從活動A.在Robolectric測試開始的結果,我們將執行所有操作需要選擇數據,創建我們將發回的意圖,然後對意圖運行斷言以確保其正確創建。
這是一個非常簡單的例子。這兩個步驟可能會被分解爲更多的測試,因爲每個單元測試只應該測試應用程序可以分解的最小功能單元。這個例子主要是幫助你以單元測試的方式開始思考。我發現,隨着我對單元測試的理解加深,我編寫代碼的方式發生了變化。我儘量避免編寫方法和類,以至於他們做了太多工作,無法進行適當的單元測試。作爲一個經驗法則,易於進行單元測試的代碼執行非常具體的操作,這在第一次閱讀代碼時很明顯。
最後,如果你想更進一步,嘲諷框架可以極大地幫助你的單元測試能力。 Mockito是我過去取得成功的嘲諷框架。模擬框架的目的是創建你嚴格控制其行爲的存根對象。 Mockito(或任何其他Mocking Framework)將允許您定義一個對象,該對象可以從您需要的任何類型擴展而來,只實現您需要的方法。您將能夠直接控制對任何這些方法調用的響應。這有助於單元測試,因爲您需要的僅有的實際的對象是被測對象;通過嘲笑所有其他對象,您將更清楚地瞭解被測對象是否正常運行,因爲所有其他行爲都是由您(測試者)明確定義的。 (是的,這確實導致了很多額外的代碼,但這是一個好的單元測試人員的生活,但是,正如前面所說的,隨着你對單元測試更加熟悉,你可能會發現自己編寫的方法需要更少的嘲弄,更有利於編寫測試,有些編碼員甚至會在編寫代碼之前編寫單元測試,以保持代碼緊湊並專注於單一目的)
希望這有助於您!
當然,它有助於繼續!非常感謝現在,所有的事情都變得更加清晰,特別是在您提供這個簡單而有效的例子時。我也考慮過使用模擬對象,所以我也會調查單元測試的這個方面。太感謝了 ! – user1987343