簡體   English   中英

Android:使用Robolectric和Mockito對Android應用程序進行單元測試

[英]Android: Unit testing Android applications with Robolectric and Mockito

我有一個Java庫,它使用Android API中的一些東西。 我想用Mockito為這個庫編寫單元測試。

我有辦法解決這個問題嗎?

Mockito在Dalvik VM上表現不佳,請看這篇文章: 將Mockito與Android虛擬機配合使用

更新:

自從這篇文章發表Robolectric以來,我就有機會在Pivotal Labs工作,並為這個庫做出了一些貢獻。 我建議在Android測試框架/ mockito上使用它。 此外,您可以自由使用Robolectric和Mockito,但Robolectric中的陰影對象使得大多數用例都不需要Mockito。

嘗試對Android進行單元測試的問題在於,您構建的Android庫的每個方法都會被刪除,要么拋出存根異常,要么返回null。 如果你想測試你的應用程序並想要任何Android行為你運氣不好,除非你使用Robolectric在類加載時動態重寫字節碼,並注入一個模擬行為的陰影對象。

更新2:

已經有一段時間了,情況發生了變化。 Robolectric中的許多Shadow類已經被真正的Android類所取代。 現在使用真正的Android jar並且Robolectric僅為更小的一組東西加載Shadow類。 這是使用Robolectric進行Android測試的更多原因。

多谷歌搜索后,我所遇到的一個答案這個在這里

基本上它涉及使用Robolectric單元測試框架,它攔截Android類的加載。 然后你可以繼續使用Mockito(雖然在大多數情況下沒有必要)並在JVM上運行你的測試!

從版本1。9。5(2012年6月3日發布)開始,您可以在Android上使用Mockito。 要做到這一點,你還需要dexmaker:

http://code.google.com/p/dexmaker/

此Wiki頁面描述了如何實現它:

http://code.google.com/p/dexmaker/wiki/Mockito

看看android-mock 它基於EasyMock 2.4(因此不如Mockito那么好但是很接近)。

它通過在構建時而不是運行時預生成模擬類來解決DalvikVM的局限性,然后在部署到設備時使用編譯的測試代碼對其進行補充。

還有一個名為Borachio的模擬框架,我無法保證,但看起來很有前途(如果你很高興能夠通過讓你的設備運行Scala的動作)。

對於與Android SDK內部類無關的所有內容,您可以避免它。 這就是我正在為我的Android項目做的事情(盡管我使用的是JMock2 ,而不是Mockito )。

我有兩個測試項目。

  • 第一個使用JUnit4JMock2 ,我將自己添加為依賴項。 我測試了所有“業務邏輯”類,但我無法測試任何與Android有關的內容(UI類,SQLiteOpenHelper等)。如果我嘗試在我的測試中使用它們,我會得到可怕的Stub! 例外。

  • 第二個使用ActivityInstrumentationTestCase2Robotium測試UI。

這可能看起來像很多工作和復雜,但實際上並非如此,我認為最好將它們分開。 UI測試不是“真正的”單元測試,它們經常測試多個單元的某些功能。 如果你正確地將你的UI層與你的業務邏輯分開(並且這樣的測試分離會迫使你以TDD風格來實現這一點),那么這一切都很順利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM