月: 2023年12月

mockkで直接モックできない場合の対応方法

DBに時刻を保存したりログを送信したりするときに現在時刻をSystem.currentTimeMillis()を実行して現在時刻を取得します。mockkでモックする場合はスタティックモックで実行しようとすると正しくモックしてくれません。

fun returnTime() {
  mockkStatic(System::class)
  every { System.currentTimeMillis() } returns 1L
  assertEquals(System.currentTimeMillis(), 1L) // StackOverflowErrorが発生し失敗する
}

System.currentTimeMillis()はシステムのネイティブメソッドなのでモックすることができません。このような場合はobjectでラップしてモックできるようにします。

object SystemTime {
  fun current() = System.currentTimeMillis()
}

fun returnTime() {
  mockkObject(SystemTime)
  every { SystemTime.current() } returns 1L
  assertEquals(1L, SystemTime.current())
}

とにかくobjectでラップしてしまえば他の場合でも使えそうですね。

https://github.com/mockk/mockk/issues/98


KAPTからKSPに移行したときのメモ

https://developer.android.com/studio/build/migrate-to-ksp?hl=ja

ルートのbuild.gradle.ktsの一番下に下記を追加する

plugins {
    id("com.google.devtools.ksp") version "1.9.20-1.0.14" apply false
}

“1.9.20-1.0.14″のハイフンの左側はkotlinのバージョンと一致しています。kotlinのバージョンに合わせてどのバージョンが必要かgithubから確認します。

https://github.com/google/ksp/releases

kaptをkspに変更する

id("kotlin-kapt")
↓
id("com.google.devtools.ksp")

kapt("xxxxxx")
↓
ksp("xxxxx")

下記を削除
kapt {
    correctErrorTypes true
    useBuildCache true
}

必要最低限の変更はこれだけですが、プロジェクトによっては関連ライブラリのバージョンアップも必要になるのでそれぞれ確認する。例としてDagger、Room、Hilt、HiltWorker、Moshi、Epoxy等

kaptからkspにするとビルド速度が早くなるって書いてある記事があったけど、あまり変わらないですね…。大規模プロジェクトだと数十秒早くなるのだろうか。