獲取一個Activity中的實際控件並操作

一個很頭疼的問題:做單元測試時,經常遇到界面與邏輯相耦合的情況:

想調用一個私有函數,必須通過其它公有函數來完成,而公有函數(或這個私有函數)的調用又涉及到一系列變量及控件的初始化,如果強行調用/使用反射調用,就會不可避免的出現NullPointerException。


解決方案:

使用ActivityInstrumentationTestCase2來獲取實際的Activity與控件。

這裏“實際的”想表達的意思是:我們手動操作一個app時,打開一個Activity一般是不會出現空指針異常的,它的各種參數、變量、控件都被完整的初始化好了,而且能完美響應各種操作。如果我們能在程序中獲取這個上下文下的Activity,就不愁那些煩人的(毫無意義的)初始化工作了。

新建一個測試工程,新建一個類並繼承自ActivityInstrumentationTestCase2<想要獲取的Activity>。運行這個Test,目標Activity就會被打開,這個類的getActivity()方法就可以獲取目標Activity了。


那如何獲取界面上的真實控件呢?

這裏“真實”想表達的意思是:在一個界面上,我們點擊一個按鈕,界面會發生跳轉;點擊一個輸入框,一些文字會發生變化;點擊另一個按鈕,會執行搜索操作……這些控件是存在於一個上下文裏的,不是孤立的。我們想要獲取的也是此時此地在此頁面上的控件。

這個也是可以實現的。上文中已經提到了獲取一個“活的”Activity的方法,那麼要獲取這個界面上的“活的”控件,只需:

EditText mSearchAreaInput = (EditText) mActivity.findViewById(R.id.search_area_input);

像這樣新建一個控件,通過findViewById獲取它即可。這時的控件就是“活的”,對它執行什麼操作跟在UI上操作它是完全一致的。


有點感慨,做單元測試這麼久了,這麼重要的東西卻還是第一次瞭解到。時時不忘,Stay hungry, Stay foolish

發佈了75 篇原創文章 · 獲贊 12 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章