2013-01-23 84 views
2

我的Robolectric單元測試有問題。Robolectric&testing startActivityForResult

沒有一個點擊開始了新的活動時,偵聽器使用方法startActivity(Intent)

但似乎Robolectric有麻煩時,一個新的活動開始與方法startActivityForResult(Intent, int)問題,我可以斷言:把一些休息的代碼讓我發現活動沒有開始(只是改變方法startActivity(Intent)做出斷言通行證)。

這是正常的嗎?很遺憾,我的應用程序的第一個活動使用startActivityForResult(Intent, int)

有人設法用這種啓動活動的方式進行測試嗎?

感謝您的幫助..

回答

2

簡短的回答你的問題是,由於道路Robolectric的Android類轉換爲在JVM中執行代碼,很多自己的功能不表現爲你所期望的。許多系統回調將不會執行,並且您必須依賴Robolectric在其Shadow類實現中提供的內容。 (請參閱@Steven_BDawg提供的鏈接)。

長的答案:這是可能實現的一個大考驗這整個流程,但它不是什麼框架設計。

Robolectric和單元測試通常不會用於您描述的方式。​​指出可以將單元視爲應用程序中最小的可測試部分。單元測試套件應包含許多輕量級測試,每個測試都會隔離應用程序中的一些功能並確保其正常工作。

考慮包含兩個活動,A和B活性的A中的基本應用程序顯示有關主題的一些信息,和活動B允許用戶選擇在A.要顯示的主題當從活動A在用戶移動到活動B,B被撥打電話startActivityForResult(),並且應該返回到所選主題的A。

現在說我們想要單元測試這個從A得到結果並顯示數據的流程。我們可把此成兩個測試:

  1. 活動在測試 - 在我們的測試活動A.,我們將創建活動A.在Robolectric測試的新實例,我們創建了我們預期B中的意圖返回到A,併爲A調用陰影方法receiveResult(),用結果代碼OK和此Intent填充參數。在receiveResult()之後,運行您的斷言。您現在知道活動A正確處理結果!
  2. 活動在測試 - 活動B.在我們的測試中,我們將創建活動B的新實例,設置它,就好像它是從活動A.在Robolectric測試開始的結果,我們將執行所有操作需要選擇數據,創建我們將發回的意圖,然後對意圖運行斷言以確保其正確創建。

這是一個非常簡單的例子。這兩個步驟可能會被分解爲更多的測試,因爲每個單元測試只應該測試應用程序可以分解的最小功能單元。這個例子主要是幫助你以單元測試的方式開始思考。我發現,隨着我對單元測試的理解加深,我編寫代碼的方式發生了變化。我儘量避免編寫方法和類,以至於他們做了太多工作,無法進行適當的單元測試。作爲一個經驗法則,易於進行單元測試的代碼執行非常具體的操作,這在第一次閱讀代碼時很明顯。

最後,如果你想更進一步,嘲諷框架可以極大地幫助你的單元測試能力。 Mockito是我過去取得成功的嘲諷框架。模擬框架的目的是創建你嚴格控制其行爲的存根對象。 Mockito(或任何其他Mocking Framework)將允許您定義一個對象,該對象可以從您需要的任何類型擴展而來,只實現您需要的方法。您將能夠直接控制對任何這些方法調用的響應。這有助於單元測試,因爲您需要的僅有的實際的對象是被測對象;通過嘲笑所有其他對象,您將更清楚地瞭解被測對象是否正常運行,因爲所有其他行爲都是由您(測試者)明確定義的。 (是的,這確實導致了很多額外的代碼,但這是一個好的單元測試人員的生活,但是,正如前面所說的,隨着你對單元測試更加熟悉,你可能會發現自己編寫的方法需要更少的嘲弄,更有利於編寫測試,有些編碼員甚至會在編寫代碼之前編寫單元測試,以保持代碼緊湊並專注於單一目的)

希望這有助於您!

+0

當然,它有助於繼續!非常感謝現在,所有的事情都變得更加清晰,特別是在您提供這個簡單而有效的例子時。我也考慮過使用模擬對象,所以我也會調查單元測試的這個方面。太感謝了 ! – user1987343

0

我爲您做了一些Google'ing。我不知道這是否會幫助你,但我認爲這是一個好的開始! Roboelectric: Testing startActivityForResult() and onActivityResult()

+1

謝謝,我已經閱讀這個頁面,不幸的是我認爲這對我的問題沒有太大的幫助。這個人正在模擬一個活動的行爲,它會將結果發送給另一個聽結果的人。我指出Robolectric似乎無法在使用startActivityForResult方法時有效地啓動活動......感謝您的幫助:) – user1987343