Open1

モックでコルーチンを扱う関数

るるすたるるすた

コルーチン用の関数

mockKでコルーチンを扱うための専用関数があります。
コルーチン専用なので、頭に「co」がついてます。

🔸 coEvery { ... }

💡 意味:
「このsuspend関数が呼ばれたら、こう返してね」と指定する

coEvery { repository.getMaxResult(any()) } returns flowOf(MaxResult(100, 5))

これは「repository.getMaxResult(...) が呼ばれたら flowOf(...) を返してね!」

🔸 coVerify { ... }

💡 意味:
「このsuspend関数がテスト中に呼ばれたかを検証する」

coVerify(exactly = 1) { repository.getMaxResult(any()) }

これは「getMaxResult(...) が1回だけ呼ばれたことを確認する!」

🔸 coAnswer { ... }

💡 意味:
「suspend 関数が呼ばれたときの振る舞いをより複雑に制御したい場合に利用」
coEveryの後に使用し、ラムダ式で処理を記述。
引数にアクセスしたり、条件に応じて異なる値を返したり、例外を投げたりといった
動的な振る舞いを定義。

// suspend fun processData(data: String): Result
coEvery { mockService.processData(any()) } coAnswer {
    val inputData = firstArg<String>() // 1番目の引数を取得
    if (inputData.length > 10) {
        Result.Error("Too long data")
    } else {
        Result.Success("Processed: $inputData")
    }
}

これは「mockServiceのprocessData関数が呼ばれたら、
その引数の長さによって返す結果を変えてね」という意味です!

💡補足: any() って?

coEvery { repository.getMaxResult(any()) }

の any() は引数が何でもいいから、この関数が呼ばれたときの動きを指定したい!
って意味。