Robolectric使用(三)驅(qū)動activity生命周期

在Robolectric2.2之前氯葬,大多數(shù)測試通過調(diào)用構(gòu)造方法來直接創(chuàng)建activites(new MyActivity()),然后手工調(diào)用生命周期方法比如onCreate()。一些shadowActivity的方法也被廣泛的應用(shadowActivity.callOnCreate())退子。


Robolectric的一個流式API ActivityController改變了這些糟糕的情況具垫,它通過模擬android如何創(chuàng)建activity和通過他們的生命周期驅(qū)動來工作赦颇。ActivityController是一個在2.0推出但是現(xiàn)在需要在2.2使用的流式API啊鸭。除了調(diào)用像onCreate()之外的方法蛇摸,它確保activity的內(nèi)部狀態(tài)和生命周期是相符的急迂。

What do I do now?

我們通常不會直接創(chuàng)建一個ActivityController影所,使用Robolectric.buildActivity()來得到。在你只是簡單的需要一個初始化好的activity的最基本的測試中僚碎,你通澈锩洌可以通過下面的方式來得到:

Activity activity=Robolectric.buildActivity(MyActivity.class).create().get();

這將會創(chuàng)建一個MyActivity的新對象,并且通過生命周期調(diào)用它的onCreate()方法勺阐。
想要驗證在onResume()的時候發(fā)生的事情是在onCreate()之后沒有發(fā)生的卷中?可以用如下方法:

ActivityController controller = Robolectric.buildActivity(MyActivity.class).create().start();
Activity activity =controller.get();
//assert that something hasnt happend
activityController.resume();
//assert it happend!

類似的方法包括start(),pause(),stop(),destroy()。如果你想要測試完整的創(chuàng)建生命周期可以用下面的代碼:

Activity activity = Robolectric.buildActivity(MyActivity.class).create().start().resume.visible().get();

你可以通過intent模擬啟動一個activity

Intent intent = new Intent(Intent.ACTION_VIEW);
Activity activity = Robolectric.buildActivity(MyActivity.class).withIntent(intent).create().get();

或者恢復savedInstanceState

Bundle savedInstanceState=new Bundle();
Activity activity = Robolectric.buildActivity(MyActivity.class).create().restoreInstanceState(savedInstanceState).get();

如果測試中需要更多的方法渊抽,可以參考AcivityController的Java Docs

在上面的使用中有一個visible()方法蟆豫,這個方法的意義是什么?
在真實的android app中懒闷,activity的view層是沒有附著到window上的直到onCreate()被調(diào)用之后十减,在這些發(fā)生之前,activity的view不會被置為visible愤估,這就意味著不能點擊他們嫉称,在真機或者模擬器上activity的onPostResume()被調(diào)用之后才會附著到window上。
所以什么時候去調(diào)用visible()?當你需要在activity進行交互的時候灵疮,比如Robolectric.clickOn()方法需要view是visible狀態(tài)并且功能完備,這種情況就需要在create()之后調(diào)用visible().



使用擴展模塊

為了減少將要測試的應用的外部依賴數(shù)量壳繁,robolectric的shadows被分割成許多擴展包震捣,Robolectric主模塊僅僅提供了為基礎androidsdk提供的shadows,對appcompat或者support library在擴展模塊中提供闹炉,如下表所示:

SDK Package Robolectric Add-On package
com.android.support.support-v4 org.robolectric: shadows-support-v4
com.android.support.multidex org.robolectric: shadows-multidex
com.google.android.gms:play-services org.robolectric: shadows-play-services
com.google.android.maps:maps org.robolectric: shadows-maps
org.apache.httpcomponents:httpclient org.robolectric: shadows-httpclient


Using Library Resources

當Robolectric運行一個test的時候蒿赢,它試圖去下載并且索引應用所有的資源,所以當調(diào)用assetManager的時候可以返回這些資源渣触。對于三方庫提供的資源羡棵,一些擴展性配置就是需要的。

Using Libraries with Gradle

如果你使用gradle構(gòu)建你的項目嗅钻,并且使用 ==RobolectricTestRunner== 來運行你的test皂冰,不需要額外的配置店展,這是因為android的gradle插件將會在構(gòu)建的時候merge三方庫資源和項目的資源文件。RobolectricGradleTestRunner在version3.1過期了秃流。

UsingLibraries with Maven

如果你使用maven來構(gòu)建項目赂蕴,你將需要告訴Robolectric哪里的unpacked 資源是為你使用的哪一個庫準備的,這個配置可以指定在@Config注解里:

@RunWith(RobolectricTestRunner.class)
@Config(libraries={
    "build/unpacked-libraries/library1",
    "build/unpacked-libraries/library2"
})
public class TestClass{
    
}

或者在robolectric.properties文件中指定:

libraries=build/unpacked-libraries/library1,build/unpacked-libraries/library2

所有路徑相對于工程的根目錄

Debugging Resource Loading Issues

如果你不能確信一個指定的庫的資源是否已經(jīng)下載完成舶胀,通過設置系統(tǒng)屬性==robolectric.logging.enabled=true== 來打開debug日志然后再運行測試概说。你會看到一些輸出如下:

loading resources for 'com.foo' from build/unpacked-libraries/library1...

如果你看不到一個指定的庫在這個列表中,再次檢查一下配置



Using Qualified Resources(限定資源)

android developer docs 的描述中嚣伐,資源限定符允許你根據(jù)設備的語言糖赔,屏幕尺寸,是否夜間等因素改變你的資源加載轩端。當你要做出嚴謹?shù)臏y試是乏味的(每個字符串都有所有支持的語言的翻譯)放典,你會發(fā)現(xiàn)你想要在不同的限定環(huán)境來運行測試。

Specifying Resources in Test

指定一個資源限定符很簡單船万,通過在你的測試用例上或者測試類上使用@Config注解簡單的添加想要的限定符刻撒,這取決于你是想要改變你整個文件還是單個測試的的資源限制。
給出如下資源values/strings.xml

<string name="not_overridden">Not Overridden</string>
<string name="overridden">Unqualified value</string>
<string name="overridden_twice">Unqualified value</string>

value-en/strings.xml

<string name="overridden">English qualified value</string>
<string name="overridden_twice">English qualified value</string>

values-en-port/strings.xml

<string name="overridden_twice">English portrait value</string>

下面使用android資源限定規(guī)則的Robolectric測試將會通過

@Test
@Config(qualifiers="en-port")
public void shouldUseEnglishAndPortraitResources(){
    final Context context = RuntimeEnvironment.application;
    assertThat(context.getString(R.id.not_overridden)).isEqualTo("Not Overridden");
    assertThat(context.getString(R.id.overridden)).isEqualTo("English     qualified value");
    assertThat(context.getString(R.id.overridden_twice)).isEqualTo("English portrait qualified value");
}

多種限定符需要用破折號分割開耿导,在google限定符列表里可以找到對應的限定符

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末声怔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舱呻,更是在濱河造成了極大的恐慌醋火,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箱吕,死亡現(xiàn)場離奇詭異芥驳,居然都是意外死亡,警方通過查閱死者的電腦和手機茬高,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門兆旬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怎栽,你說我怎么就攤上這事丽猬。” “怎么了熏瞄?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵脚祟,是天一觀的道長。 經(jīng)常有香客問我强饮,道長由桌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮行您,結(jié)果婚禮上铭乾,老公的妹妹穿的比我還像新娘。我一直安慰自己邑雅,他們只是感情好片橡,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淮野,像睡著了一般捧书。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上骤星,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天经瓷,我揣著相機與錄音,去河邊找鬼洞难。 笑死舆吮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的队贱。 我是一名探鬼主播色冀,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柱嫌!你這毒婦竟也來了锋恬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤编丘,失蹤者是張志新(化名)和其女友劉穎与学,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘉抓,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡索守,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了抑片。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卵佛。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖敞斋,靈堂內(nèi)的尸體忽然破棺而出级遭,到底是詐尸還是另有隱情,我是刑警寧澤渺尘,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站说敏,受9級特大地震影響鸥跟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一医咨、第九天 我趴在偏房一處隱蔽的房頂上張望枫匾。 院中可真熱鬧,春花似錦拟淮、人聲如沸干茉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽角虫。三九已至,卻和暖如春委造,著一層夾襖步出監(jiān)牢的瞬間戳鹅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工昏兆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枫虏,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓爬虱,卻偏偏與公主長得像隶债,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子跑筝,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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