2011-11-10 144 views
12

我有一個Java庫,它使用Android API中的一些東西。我想用Mockito爲這個庫編寫單元測試。Android:使用Robolectric和Mockito單元測試Android應用程序

有沒有一種方法可以讓我去呢?

的Mockito不會在Dalvik虛擬機發揮不錯,看到這個帖子:Using Mockito with Android virtual machine

UPDATE:

由於這個職位,我已經發現Robolectric,我已經有工作的機會走出Pivotal實驗室併爲這個圖書館做出一些小貢獻。我會建議在Android測試框架/ mockito上使用它。此外,您可以自由使用Robolectric和Mockito,但Robolectric中的陰影對象使Mockito在大多數使用情況下不再需要。

,試圖單元測試Android的問題是,你建立在Android圖書館的每一個方法存根要麼拋出一個異常存根,或返回null。如果你想測試你的應用程序並且想要任何Android行爲,那麼你運氣不好,除非你使用Robolectric在類加載時重寫字節碼並注入模擬行爲的陰影對象。

更新2:

它已經有一段時間,事情發生了變化。 Robolectric中的許多Shadow類已經被真正的Android類取代。現在使用真正的Android Jar,Robolectric僅爲更小的一組內容加載Shadow類。這是使用Robolectric進行Android測試的更多原因。

回答

9

經過很多谷歌搜索,我遇到了這個here的答案。

基本上它涉及到使用Robolectric單元測試框架,它攔截Android類的加載。然後,您可以繼續使用Mockito(儘管在大多數情況下不需要)並在JVM上運行測試!

+0

我使用Mockito的Spy構造與Robolectric提供的構建器結合使用。這樣我就可以在需要時對android組件進行部分模擬,例如FooActivity foo = spy(Robolectric.buildActivity(FooActivity.class).get()); doReturn(mock).when(foo).getSomething(); – Alix

1

看看android-mock。它基於EasyMock 2.4(不像Mockito那麼好,但非常接近)。

它通過產生預先在構建時的模擬類,而不是運行時間,然後用你的編譯測試代碼捆包將其部署到設備時,得到周圍的DalvikVM的侷限性。

還有一個叫做Borachio的嘲諷框架,我不能擔保,但看起來很有前途(如果你很樂意通過讓Scala運行在你的設備上的動作)。

+0

是的,我知道這個問題的。如果我不需要,我試圖避免使用它。 Mockito的語法更好。 –

1

能避免的話,對於沒有任何與Android SDK內部類的一切。 這就是我爲我的Android項目所做的(儘管我使用的是JMock2,而不是Mockito)。

我有兩個測試項目。

  • 第一個使用JUnit4JMock2我添加自己的依賴。我測試了所有的「業務邏輯」類,但我無法測試任何與Android(UI類,SQLiteOpenHelper等)有關的事情。如果我嘗試在我的測試中使用它們,我會遇到可怕的Stub!異常。

  • 第二個測試UI,使用ActivityInstrumentationTestCase2Robotium

這可能看起來像很多工作和複雜,但事實並非如此,實際上我認爲最好將它們分開。UI測試不是「真正的」單元測試,他們經常測試多個單元的某些功能。如果您將UI層與業務邏輯正確分開(並且做到這種分離測試會迫使您以TDD風格執行此操作),那麼它就非常好而且流暢。

+0

感嘆。問題是我的業務模型類使用AsyncTask來抓取每個頁面上我在應用中使用的每一條數據。我在想,因爲AsyncTask基本上是一個POJO,所以我可以只爲它獲取代碼並將其放入我的項目中並失去依賴關係。 –

+0

如果我是你,我會嘗試將所有Android依賴關係抽象出來,以便Stub不會妨礙。可能不如AsyncTask聽起來那麼容易...... – Guillaume

+0

@Chirstopher Perry:你有沒有得到一些解決方案來有效地測試ASync Tasks?我現在有點兒在同一條船上。 – bianca

2

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

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

此wiki頁面介紹瞭如何實現它:

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

+0

這不會給你任何Android的行爲。 Robolectric仍然是最好的選擇,因爲它提供了Mocks(影子類)和Android行爲。 –

+2

我明白,但你的問題不是'什麼是Android最好的嘲笑框架',而是'我怎樣才能使用Mockito和Android'。 –

+0

@ChristopherPerry我認爲實際上可能會有一些混亂。以這種方式將Mockito與Android測試框架和JUnit一起使用意味着您的測試可以在實際設備或模擬器上運行,這意味着所有Android類都可用。 Android測試框架還提供了內置模擬,例如'MockContext'。 –

相關問題