はじめに
ほぼメモの殴り書きですが結構詰まったので個人用にまとめました。
他にも詰まったら更新していきたい
liveDataのテストを書きたい
LiveDataをあれこれする際にはメインスレッドで動かす必要があるようですがUnitTest内だとメインスレッドで実行されないのでだめのようです。
普通にUT書く際には以下を記述していましたがSpekで実行する場合は怒られました。
@Rule
@JvmField
var instantTaskExecutorRule = InstantTaskExecutorRule()
class TestArchTaskExecutor : TaskExecutor() {
override fun executeOnDiskIO(runnable: Runnable) {
runnable.run()
}
override fun isMainThread(): Boolean {
return true
}
override fun postToMainThread(runnable: Runnable) {
runnable.run()
}
}
beforeEachTest {
ArchTaskExecutor.getInstance().setDelegate(TestArchTaskExecutor())
}
afterEachTest {
ArchTaskExecutor.getInstance().setDelegate(null)
}
右クリック実行がしたい
@RunWith(JUnitPlatform::class)を入れていなかった
エラー吐かれたらbuild.gradleを確認しましょう
dependencies {
testImplementation 'org.jetbrains.spek:spek-api:${version}'
testImplementation 'org.jetbrains.spek:spek-junit-platform-engine:${version}'
testImplementation 'org.junit.platform:junit-platform-runner:${version}'
testImplementation "org.jetbrains.kotlin:kotlin-reflect:${version}"
}
※Android studioのSpekFrameworkをInstallしても解決しました。
mockkを入れたら動かない
RunWithでなくSpekFrameworkで動かしていると下記エラーが起きてしまった際に解決した方法
java.lang.NoClassDefFoundError: io/mockk/proxy/MockKAgentFactory
//モックインスタンスの生成
val mockService : MockService = mockk()
//下記のこっちだと動く
val mockService = mockk<MockService>()