Robolectric中的若干問題(記錄待解決)

robolectric使得可以在jvm中運(yùn)行android代碼。

Question 1

一般而言,在使用robolectric對(duì)activity中的方法進(jìn)行測(cè)試的時(shí)候,需要先setup出一個(gè)activity對(duì)象,然后來調(diào)用這個(gè)activity對(duì)象的方法,或者通過這個(gè)activity對(duì)象去findViewById一個(gè)View,然后performClick,模擬點(diǎn)擊這個(gè)view。

Robolectric.setupActivity(RoboActivity.class);


文檔中并沒有任何注釋。大概猜測(cè)這個(gè)方法在執(zhí)行后,會(huì)走activity生命周期的onCreate,onResume等方法,并將context傳入。(大概類似手機(jī)點(diǎn)擊打開了這個(gè)界面)那么,問題來了,在執(zhí)行其生命周期方法時(shí),大量的外部依賴如何解決。

前提:由于Application里面有不少加載so庫,初始化等的方法,故使用
@Config(constants= BuildConfig.class,sdk=21,application= RoboApplication.class)自己定義一個(gè)空的BaseApplication來代替。

在執(zhí)行onCreate方法時(shí),大多android相關(guān)的代碼可以正常執(zhí)行,但一旦涉及到application的,比如mSpu=newSharedPreferencesUtil(UIUtils.getContext());

UIUtils.getContext()的操作需要去獲得一個(gè)application 的context,由于Robolectric模擬的是RoboApplication的啟動(dòng),并沒有去啟動(dòng)app自身的application,因此這個(gè)context獲取的是null。導(dǎo)致后續(xù)關(guān)于sharedPreference的所有操作無法執(zhí)行。

如果RoboActivity是一個(gè)普通對(duì)象,那么可以通過依賴注入,把sharedPreference通過構(gòu)造函數(shù)傳入,在傳入時(shí),把sharedPreference 進(jìn)行mock就行了。(這就是所謂的隔離了sharedPreference這個(gè)依賴?)但這是activity,如何隔離這個(gè)依賴?

隔離不了這些依賴,是否對(duì)于這樣一個(gè) 上千行的activity,就無法對(duì)其進(jìn)行測(cè)試了?

Question 2


//用于robolectric進(jìn)行測(cè)試的方法,待修改為正常方法? //FIXME: 17/8/11

public voidsetLayoutParamsTest(RelativeLayout rl_college_list_img) {

rl_college_list_img.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,UIUtils.getScreenWidth((Activity)mContext)/2));

}

某日需求變更,需要將列表展示的圖片高度調(diào)整為屏幕寬度的一半,于是在Adapter里面寫了上面這個(gè)方法,結(jié)果運(yùn)行后崩潰。發(fā)現(xiàn)rl_college_list_img處在LinerLayout中,因此會(huì)有LayoutParams cast Exception。這一過程經(jīng)歷了運(yùn)行,然后再手動(dòng)點(diǎn)擊到修改頁面,才發(fā)現(xiàn)問題。心血來潮,如果用單元測(cè)試是否可以不用這么麻煩,直接單測(cè),十幾秒內(nèi)就發(fā)現(xiàn)問題呢。于是對(duì)Adapter進(jìn)行測(cè)試,并創(chuàng)建上面的方法。Run ~?


竟然通過了。

有點(diǎn)崩潰。debug發(fā)現(xiàn) 好像真的就只執(zhí)行了這個(gè)方法中的一部分


requestLayout();的執(zhí)行似乎沒有效果(debug得不仔細(xì),只是推測(cè)),因此并沒有上層父布局Linerlayout的onMeasure操作,而這個(gè)異常就是由onMeasure調(diào)用measureVertical后拋出的。
心態(tài)崩了... ? ?這也測(cè)不出來,要你何用。



所以到底如何能夠讓大多數(shù)方法可測(cè)呢?就像小創(chuàng)說的效果:

”節(jié)約時(shí)間:對(duì)于安卓開發(fā)來說,一遍一遍的運(yùn)行app,再執(zhí)行相應(yīng)的用戶操作,看界面是否顯示正確的結(jié)果,通過這種方式來測(cè)試自己的新代碼、重構(gòu)是否是正確的,這是非常浪費(fèi)時(shí)間的一件事情,而且效果還不好。有了單元測(cè)試,我現(xiàn)在開發(fā)過程中幾乎已經(jīng)不用把a(bǔ)pp運(yùn)行起來了,速度相對(duì)來說快多了。“http://www.lxweimin.com/p/68212278f592

感覺完全辦不到啊,任何一個(gè)ui上的改動(dòng),都似乎要運(yùn)行起手機(jī)。


后期再看看有沒有使用空間,不然真的要棄坑了...


8.15更新:

Advantage1:


吸收大神的經(jīng)驗(yàn),盡量用隔離android代碼與java代碼,然后用junit4對(duì)java進(jìn)行測(cè)試。今天抽出一個(gè)model層,將異步網(wǎng)絡(luò)請(qǐng)求request類放入這層。 model層應(yīng)該是不會(huì)含有任何android 代碼的,ok,寫好


run~。 fail了。'java.lang.RuntimeException: Method isEmpty in android.text.TextUtils not mocked'錯(cuò)誤。 ok,doRequest里面用到了 android的TextUtils類。
http://www.lxweimin.com/p/f5d197a4d83a,根據(jù)鍵盤男 的這個(gè)經(jīng)驗(yàn)...在test/java目錄下,創(chuàng)建android.text.TextUtils類.

繼續(xù)run~fail again


好吧,用了一個(gè)全包全能的xutill來做網(wǎng)絡(luò)請(qǐng)求就是坑,里面還用了looper。這下就很難用Junit4來測(cè)了。 這時(shí)候想到了Robolectric,加上Robolectric的注解,run,passed。

好的,看來Robolectric有時(shí)候還挺有用的,對(duì)于我這個(gè)渣項(xiàng)目來說還管用。

(僅僅對(duì)問題進(jìn)行記錄,如果了解決方法再更新。有大神路過請(qǐng)不吝解答^_^)

這樣一來是不是只能用 AndroidJunit 、Espresso了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,497評(píng)論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評(píng)論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評(píng)論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,727評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,411評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,945評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,777評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,978評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,216評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評(píng)論 1 286
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,657評(píng)論 3 391
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,960評(píng)論 2 373

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,643評(píng)論 25 708
  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,466評(píng)論 2 45
  • EnglishVersion ->_->:https://github.com/jiang111/awesome-...
    聶順閱讀 1,245評(píng)論 0 4
  • 孩子,雖然你們的童年早已過去,但媽媽仍想對(duì)你說,“節(jié)日快樂!永遠(yuǎn)快樂!” 今天看到許多孩子在父母的陪伴下,愉快的過...
    六月蓮閱讀 511評(píng)論 2 16
  • 彼此一路見證著 對(duì)方不完美的成長(zhǎng) 在過去的很長(zhǎng)一段時(shí)間里 我甚至迷失了自己 我想 你我曾并肩那么久 我見證著青澀的...
    莊周大叔閱讀 179評(píng)論 0 0