測試依賴
添加測試所需要的依賴:
- JUnit:默認已經添加
- Mockito: 模擬對象
打開菜單【File】,選擇【Project Structure】,在【Dependenices > Modules > app】,點擊【+】按鈕,選擇【Library Dependenices】
在搜索框輸入:org.mockito,點擊 Search, 選擇類庫
- mockito-core
- mockito-inline
然後在 Step 2中選擇【testImplementation】
查看:app/build.gradle
testImplementation 'org.mockito:mockito-core:4.6.1'
testImplementation 'org.mockito:mockito-inline:4.6.1'
記得 Sync now
testImplementation作用範圍表示,這兩個依賴項只包括在應用的測試編譯裏。這樣就能避免在APK包裏捎帶上無用代碼庫了。
你用來創建和配置模擬對象的函數都在mockito-core裏了。
而mockito-inline是方便Mockito搭配Kotlin使用的特殊依賴。
在Kotlin中,所有的類都是final的。也就是說,要想繼承這些類,就得用上open修飾符。不幸的是,Mockito主要靠繼承來模擬測試類。這樣一來,如果Mockito想模擬Kotlin類,就做不到開箱即用了。mockito-inline依賴的作用就是繞開Kotlin的繼承限制,不用修改源文件,就能讓Mockito模擬Kotlin的那些final類和函數。
創建測試類
JUnit是最常用的Android單元測試框架,能和Android Studio無縫整合。要用它測試,首先要創建一個用作JUnit測試的測試類。打開SoundViewModel.kt文件,使用Command+Shift+T(或Ctrl+Shift+T)組合鍵。Android Studio會嘗試尋找這個類關聯的測試類。如果找不到,它就會提示新建
最後一步是選擇創建哪種測試類,或者說選擇哪個測試目錄存放測試類(androidTest和test)。在androidTest目錄下的都是整合測試類。
這裏,我們進行的是單元測試,故選擇 test目錄測試
點擊【OK】按鈕,自動生成測試類,如下圖所示
修改測試類並運行
修改下SoundViewModel.kt
class SoundViewModel: BaseObservable() {
// val title: MutableLiveData<String?> = MutableLiveData()
//
// var sound: Sound? = null
// set(sound) {
// field = sound
// title.postValue(sound?.name) // 通知佈局,數據更新了
// }
var sound: Sound? = null
set(sound) {
field = sound
notifyChange()
}
@get:Bindable
val title: String?
get() = sound?.name
}
修改測試類SoundViewModelTest.kt
class SoundViewModelTest {
private lateinit var sound: Sound
private lateinit var subject: SoundViewModel
@Before
fun setUp() {
sound = Sound("assetPath")
subject = SoundViewModel()
subject.sound = sound
}
@Test
fun exposesSoundNameAsTitle() {
assertTrue(subject.title.equals(sound.name))
}
}
- 以@Before註解的包含公共代碼的函數會在所有測試之前運行一次。按照約定,所有單元測試類都要有一個以@Before註解的setUp()函數。
爲了運行測試,右鍵單擊SoundViewModelTest類名,然後選擇Run 'SoundViewModelTest'。隨後,Android Studio的底部窗口會顯示測試結果
通過測試: