2012-06-28 99 views
1

我想爲Android應用程序編寫功能測試。問題是我已經探索過的大多數功能測試框架(calabash-android,robotium)對可以在相同測試中測試的不同應用程序的活動數量有限制。因此,如果在一個工作流程中,我需要從android聯繫人選擇器中選擇一些聯繫人,我無法測試整個流程,因爲聯繫人選擇器活動是android聯繫人應用程序的一部分,並且框架無法從我的應用程序和聯繫人應用程序中測試活動與此同時。嘲笑使用Mockito的聯繫人應用程序的Android應用程序

我的團隊想到的一種可能的解決方案是剔除對聯繫人活動的調用,以便通過聯繫信息返回虛擬意圖,以便測試我們的應用程序工作流程。我們正在嘗試使用mockito來實現這一點。不過,我很早就被卡住了。這裏就是我試圖做

MyActivity mockActivity = mock(MyActivity.class); 
when(mockActivity.startActivityForResult(<?>,anyInt())).thenReturn(fakeIntent); 

我不知道要放什麼東西在第一個參數在第二行。我試過Intent.class和android.content.Intent.class,但它會引發編譯錯誤。如果任何人使用mockito進行嘲諷活動,一些幫助將不勝感激。

P.S. - 如果我正確地理解,模擬測試在功能測試中比單元測試更多地使用。所以這些測試將更多地是一個混合。如果任何人有更好的建議,關於如何去Android上的這些功能測試,我是全部耳朵。

回答

0

如果不知道您的startActivityForResult方法的簽名,很難回答這個問題,但總體思路是使用any(Xxx.class),其中Xxx是參數的類型。因此,無論

when(mockActivity.startActivityForResult(any(Xxx.class),anyInt())).thenReturn(fakeIntent); 

或(那種當量)

doReturn(fakeIntent).when(mockActivity).startActivityForResult(any(Xxx.class),anyInt()); 
0

的問題是,你不能真正「模擬」(實際上是「間諜」)上的活動你的測試,因爲它創建不受Android的檢測代碼控制。在你可以控制的單元測試環境中,你可以按照mock(MyActivity.class)spy(myActivityInstance)的路徑(間諜實際上會更好,因爲你可以重新使用大部分活動的原始實現),但在這裏沒有。

我發現這個難題的唯一解決方案是將活動中的某些功能移到工具類中,理想情況下使用roboguice@ContextSingleton s可用於處理活動結果)。然後,在您的測試項目中,您將創建自己的測試Guice注入器,在您首次調用getActivity()之前將其設置爲基礎應用注入器,然後讓活動在您的模擬實用程序類中工作。

I outlined the complete process here.