大連Android軟件應(yīng)用系統(tǒng)開發(fā)的體系結(jié)構(gòu)非常適于使用MVP模式進(jìn)行開發(fā)。與MVC模式不同,Android中的Activity 并不是一個標(biāo)準(zhǔn)的 Controller,它的首要職責(zé)是加載應(yīng)用的布局和初始化用戶界面,同時接受并處理來自用戶的操作請求,進(jìn)而作出響應(yīng)。隨著界面及其邏輯的復(fù)雜度不斷提升, Activity類的職責(zé)不斷增加,以致于變得龐大臃腫。當(dāng)我們將其中復(fù)雜的邏輯處理移至另外一個類(Presneter)中時,Activity其實(shí)就是MVP模式中View,它負(fù)責(zé)UI元素的初始化,建立UI元素與Presenter的關(guān)聯(lián)(Listener之類),同時自己也會處理一些簡單的邏輯(復(fù)雜的邏輯交由Presenter處理)。
通過這種職責(zé)的分離,一方面代碼的可讀性得到了提高,另一方面我們可以更為方便地通過Mock Activity的方式對各種邏輯(Presenter 中的方法)進(jìn)行測試。
對于測試環(huán)境的搭建和測試Android相關(guān)的代碼,我們則借助于Robolectric的幫助。
致遠(yuǎn)服軟認(rèn)為:http://www.soft8.com.cn/Robolectric在其所提供的測試框架中完全模擬了Android SDK的JAR 文件(不會再有惱人的 Stub 異常),它使得我們的測試可以運(yùn)行于 JVM 之上(速度得到大幅度地提升),因此我們可以用它對 Android 應(yīng)用進(jìn)行測試驅(qū)動開發(fā)。Roblectric 同時實(shí)現(xiàn)了 Android 中對 XML的解析,模擬了View、Layout以及資源的加載,它使得Android的環(huán)境對于開發(fā)人員來說更像是一個黑盒,從而使大連遠(yuǎn)程會議系統(tǒng)開發(fā)人員不用大量使用Mock就可以方便地對資源狀態(tài)和Android相關(guān)的代碼進(jìn)行測試。
Robolectric使用了Javassist 在運(yùn)行時動態(tài)修改Android.jar中類的Byte code,Robolectric會在JVM加載 Android.jar包的時候,重寫其中類的方法。Roblectroic會讓這些方法有返回值(null 或是0)而不是拋出異常,或者將這些方法調(diào)用轉(zhuǎn)向Shadow Objects來模擬Android SDK的實(shí)現(xiàn)。Shadow Objects是Robolectric 在運(yùn)行時插入到Android.jar包相應(yīng)的類中的,它們會實(shí)際處理方法的調(diào)用并記錄相應(yīng)的狀態(tài),以備在assert的時候進(jìn)行查詢。Robolectric提供了大量的Shadow Objects,覆蓋了大連Android軟件應(yīng)用系統(tǒng)開發(fā)測試開發(fā)過程中絕大多數(shù)邏輯功能的需要。
基于大連Android軟件應(yīng)用系統(tǒng)開發(fā)的測試需要使用其特定的Test Runner(RobolectricTestRunner)來運(yùn)行,我們可以通過擴(kuò)展 RobolectricTestRunner 來創(chuàng)建一個自己的 Test Runner,同時在其構(gòu)造函數(shù)中設(shè)定需要加載的AndroidManifest.xml和resource目錄。