iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0
Mobile Development

【Kotlin Notes And JetPack】Build an App系列 第 27

Day 27.【Test】Unit Test 的介紹與應用

  • 分享至 

  • xImage
  •  

今天要來試試寫 Unit Test,針對 ViewModel 的邏輯驗證不管什麼 input 都要符合我想要的 output,以下如有解釋不清或是描述錯誤的地方還請大家多多指教:

什麼?

Unit Test 又稱為單元測試,測試每一個最小函式是否能正常運行,某些情境下會讓我們難以測試,所以在開發時要避免以下幾點:

  • 高耦合:在一個 unit 中有過多的物件直接被建立,變因過多,無法乾淨的測試原本的項目
  • side-effect:跟上一個的情境差不多,如果有 side-effect 的函式,這樣就會造成每次的 output 都會不符合我們的預期

而測試的流程只要符合 3A 大致就可以執行了:

  • Arrange (環境建置)
  • Act (測試目標項目)
  • Assert (比對結果是否如預期)

如何?

| Set up

原先在專案建立時就已經幫我們配置好了 Junit,另外在這邊使用 mockk 來 mock 我們預期的結果

dependencies {
    def mockk_version = "1.12.3"
	testImplementation 'junit:junit:4.13.2'
	testImplementation "io.mockk:mockk:${mockk_version}"
    testImplementation "io.mockk:mockk-android:${mockk_version}"
    testImplementation "androidx.arch.core:core-testing:2.1.0"
    testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4"
}

也可看到有兩個資料夾,一個是給 UI test 一個是給 Unit Test
https://ithelp.ithome.com.tw/upload/images/20221011/201511453NlFYzsBeU.png

| Create Test File

https://ithelp.ithome.com.tw/upload/images/20221011/20151145zLgYwkgsVT.png

class MainViewModelTest {
    private val isCardInsertedOb: Observer<Resource<Boolean>> = mockk(relaxed = true)
    private val repository: Repository = mockk(relaxed = true)
    private lateinit var viewModel: MainViewModel

    @get:Rule
    var instantTaskExecutorRule = InstantTaskExecutorRule()

    @Before
    fun setup() {
        viewModel = MainViewModel(repository)
        viewModel.isCardInserted.observeForever(isCardInsertedOb)
    }

    @Test
    fun getCurrentForecast() = runTest {
        val testDispatcher = UnconfinedTestDispatcher(testScheduler)
        Dispatchers.setMain(testDispatcher)

        try {
            viewModel.getForecast("test")
            verify { isCardInsertedOb.onChanged(any()) }
			assertEquals(true, (viewModel.isCardInserted.value as Resource.Success).data)
        } finally {
            Dispatchers.resetMain()
        }
    }

}

上一篇
Day 26.【DI】Hilt 的介紹與應用
下一篇
Day28.【Test】UI Test 的介紹與應用
系列文
【Kotlin Notes And JetPack】Build an App30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言