Closed1

アンドロイドテストでViewModelを扱うとき

るるすたるるすた

mockkを利用する目的

Geminiが教えてくれました。

Mockk を使う目的は、PromptViewModel のように直接インスタンス化すると
テストが複雑になるコンポーネントを、テストしやすいように振る舞いを「模擬」すること

なんか難しいこと書いてあるけど、mockkを使うと簡単にテストコードが書けます!
ということかなと思いました まる
すごく詳しく知りたい場合は、以下を参考にしよう!!!
https://qiita.com/dev-tatsuya/items/d3cfc9853c53dfaee222

依存関係導入

いつもの流れですが、依存関係を先に設定します。

libs.versions.toml

[versions]

mockkAndroid = "1.13.11"
mockk = "1.13.11"

[libraries]

mockk-android = { module = "io.mockk:mockk-android", version.ref = "mockkAndroid" }
mockk-mockk = { module = "io.mockk:mockk", version.ref = "mockk" }

build.gradle.kts

dependencies {
    //mockk
    testImplementation(libs.mockk.mockk) 
    androidTestImplementation(libs.mockk.android) // Androidテスト用

→Sync Now!!!!

mockkでテストを作成

ルール作成と変数の宣言をする

class CanvasSecTest {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<ComponentActivity>()

    //後でこのviewModelをmockkを使ってモック化
    private lateinit var viewModel: PromptViewModel
    private lateinit var uiStateFlow: MutableStateFlow<PromptUiState>

Beforeを設定

テストをsetupしていきます。重要・・・。
①uiStateFlowにviewModelの初期化状態を設定
②MockKを使ってviewModelのモックを作成
③viewModelのuiStateプロパティをモック化したuiStateFlowに設定

        //viewModelのupdateUiStateメソッドをモック化
        val slot = slot<(PromptUiState) -> PromptUiState>()
        every { mockViewModel.updateUiState(capture(slot)) } answers {
            uiStateFlow.value = slot.captured(uiStateFlow.value)
            Runs
        }
このスクラップは3ヶ月前にクローズされました