《Android編程權(quán)威指南》之音頻播放與單元測試(二)

《Android編程權(quán)威指南》第 20 章第二篇蚌讼,補(bǔ)充完 BeatBox 應(yīng)用的單元測試?yán)病?/p>

第一篇地址:

https://juejin.cn/post/7033347707473231879

八城瞎、編寫測試函數(shù)

測試函數(shù)將用到 @Test 注解谜疤。

    @Test
    fun exposesSoundNameAsTitle(){
        assertThat(subject.title,`is`(sound.name))
    }

assertThat(...) 選 org.junit 庫里的 Assert.assertThat(...) 函數(shù)商模,is(...) 選 org.hamcrest 庫里的 Is.is 函數(shù)苏携。

上面代碼意思是斷定測試對象獲取標(biāo)題函數(shù)和 sound 的獲取文件名函數(shù)返回相同的值鉴分。如果不同楣责,單元測試失敗。

接下來測試 SoundViewModel 和 BeatBox.play(Sound) 的交互坯台。

    @Test
    fun callsBeatBoxPlayOnButtonClicked(){
        subject.onButtonClicked()
    }

為了測試 SoundViewModel 不讓它跟 BeatBox 綁太死炬丸,不依賴 BeatBox 對象,就在此測試案例中模擬出 BeatBox 對象蜒蕾。

class SoundViewModelTest {
    ...
    private lateinit var beatBox: BeatBox
    @Before
    fun setUp() {
        beatBox = mock(BeatBox::class.java)
        ...
    }
    ...
}

Mockito 的 verify(Object) 可以確認(rèn)稠炬,要測試的函數(shù)是否都按預(yù)期被調(diào)用了。

    @Test
    fun callsBeatBoxPlayOnButtonClicked(){
        ...
        verify(beatBox).play(sound)
    }
失敗了

然后按照書中過程補(bǔ)充修正一下咪啡,把 BeatBox 傳給 SoundViewModel首启,修正 SoundHolder 中的錯誤,在測試類里提供模擬板 BeatBox撤摸,實(shí)現(xiàn) onButtonClicked() 函數(shù)毅桃。具體代碼略了,見 Demo准夷。

通過了

九钥飞、數(shù)據(jù)綁定回調(diào)

在布局文件里,添加數(shù)據(jù)綁定 lambda 表達(dá)式衫嵌,讓按鈕對象和 SoundViewModel.onButtonClicked() 函數(shù)關(guān)聯(lián)起來读宙。

    <Button
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:onClick="@{()->viewModel.onButtonClicked()}"
        android:text="@{viewModel.title}"
        tools:text="Sound name" />

運(yùn)行應(yīng)用,點(diǎn)擊按鈕楔绞,就能聽到奇怪的喊叫聲了结闸,可以自行體驗(yàn)下。

十酒朵、釋放音頻

音頻播放完畢桦锄,應(yīng)調(diào)用 SoundPool.release() 函數(shù)釋放 SoundPool。

在 BeatBox 中添加方法:

    fun release(){
        soundPool.release()
    }

然后在 MainActivity 銷毀的時候調(diào)用它:

    override fun onDestroy() {
        super.onDestroy()
        beatBox.release()
    }

十一蔫耽、深入學(xué)習(xí):整合測試

  • 單元測試中结耀,受測對象是單個類。保證各個類單元正確運(yùn)行针肥,相互之間的交互符合預(yù)期饼记。

  • 整合測試中,受測對象是應(yīng)用的一部分慰枕,包括協(xié)同工作的眾多對象具则。驗(yàn)證受測各部分已正確整合在一起,按預(yù)期發(fā)揮作用具帮。在 Android 平臺上博肋,整合測試通常還是指 UI 級別的測試(和UI部件交互低斋,驗(yàn)證它們的行為表現(xiàn)是否符合預(yù)期)。常以 instrumentation 測試來實(shí)施匪凡。

Espresso 是 Google 開發(fā)的一個 UI 測試框架膊畴,可用來測試 Android 應(yīng)用。通常新項(xiàng)目都會自動的引用這個依賴病游。

 androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

可用它來測試某個 activity 的行為唇跨。

斷定屏幕上某個視圖顯示了第一個 sample_sounds 受測文件的文件名:

@RunWith(AndroidJUnit4::class)
class MainActivityTest {
    
    @get:Rule
    val activityRule = ActivityTestRule(MainActivity::class.java)
    
    @Test
    fun showsFirstFileName(){
        onView(withText("65_cjipie"))
            .check(matches(isDisplayed()))
    }
}

@RunWith(AndroidJUnit4.class) 表明,這是一個Android工具測試衬衬,需要 activity 和其他 Android 運(yùn)行時環(huán)境支持买猖。

activityRule 上的 @get:Rule 注解告訴 JUnit,運(yùn)行測試前滋尉,要啟動一個 MainActivity 實(shí)例玉控。

onView(withText("65_cjipie")) 會找到顯示 “65_cjipie” 的視圖,對其執(zhí)行測試狮惜。

check(matches(isDisplayed())) 用來判定視圖在屏幕上看得見高诺。

有關(guān) Espresso 詳情參考:

https://developer.android.com/training/testing/espresso

十二、深入學(xué)習(xí):模擬對象與測試

模擬對象假扮成其他不相干的組件碾篡,為的就是隔離受測對象虱而。對于單元測試來說,能快速創(chuàng)建模擬對象的 Mockito 非常有用开泽。

但是整合測試時薛窥,最好避免使用像 Mockito 這樣的自動模擬測試框架,因?yàn)槟M太重了眼姐,需要很多整合測試共享,太繁瑣佩番。

基本原則:模擬對象的效用不應(yīng)超出受測組件的邊界众旗。應(yīng)著重關(guān)注測試范圍,防止測試越界趟畏。

十三贡歧、挑戰(zhàn)練習(xí):播放進(jìn)度控制

給 BeatBox 應(yīng)用添加播放進(jìn)度控制功能,在MainActivity中赋秀,使用SeekBar部件控制SoundPool的play(Int, Float, Float, Int, Int, Float)函數(shù)的播放速率參數(shù)值利朵。

參考 Demo,指不定啥時候就更新了猎莲。O(∩_∩)O哈哈~

十四绍弟、挑戰(zhàn)練習(xí):設(shè)備旋轉(zhuǎn)問題

給 BeatBox 應(yīng)用添加一個 Jetpack 版 ViewModel,實(shí)現(xiàn)在設(shè)備旋轉(zhuǎn)時保存BeatBox對象著洼。

參考 Demo樟遣,指不定啥時候就更新了而叼。O(∩_∩)O哈哈~

其他

BeatBox 項(xiàng)目 Demo 地址:

https://github.com/visiongem/AndroidGuideApp/tree/master/BeatBox

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市豹悬,隨后出現(xiàn)的幾起案子葵陵,更是在濱河造成了極大的恐慌,老刑警劉巖瞻佛,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脱篙,死亡現(xiàn)場離奇詭異,居然都是意外死亡伤柄,警方通過查閱死者的電腦和手機(jī)绊困,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來响迂,“玉大人考抄,你說我怎么就攤上這事≌嵬” “怎么了川梅?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長然遏。 經(jīng)常有香客問我贫途,道長,這世上最難降的妖魔是什么待侵? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任丢早,我火速辦了婚禮,結(jié)果婚禮上秧倾,老公的妹妹穿的比我還像新娘怨酝。我一直安慰自己,他們只是感情好那先,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布农猬。 她就那樣靜靜地躺著,像睡著了一般售淡。 火紅的嫁衣襯著肌膚如雪斤葱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天揖闸,我揣著相機(jī)與錄音揍堕,去河邊找鬼。 笑死汤纸,一個胖子當(dāng)著我的面吹牛衩茸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹲嚣,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼递瑰,長吁一口氣:“原來是場噩夢啊……” “哼祟牲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抖部,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤说贝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后慎颗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乡恕,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年俯萎,在試婚紗的時候發(fā)現(xiàn)自己被綠了傲宜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡夫啊,死狀恐怖函卒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撇眯,我是刑警寧澤报嵌,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站熊榛,受9級特大地震影響锚国,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玄坦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一血筑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧煎楣,春花似錦豺总、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至休蟹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間日矫,已是汗流浹背赂弓。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哪轿,地道東北人盈魁。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像窃诉,于是被迫代替她去往敵國和親杨耙。 傳聞我的和親對象是個殘疾皇子赤套,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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