私はmockkでいくつかのものをモックしようとして立ち往生しています:
私はgradleに次のセットアップを持っています
_root:
|-- App (just a sample app for the SDK)
|-- SDK (SDK we develop) << apply plugin: 'com.Android.library'
|-- SDKimpl.kt
|-- Foo (wrapper around a .jar library) << apply plugin: 'com.Android.library'
|-- Foo.kt
_
だから私はSDKのandroidTest
を書いて、_Foo.kt
_をモックしようとしています。 Fooクラスに異常はなく、直接class Foo(private val someParams) {
したがって、_androidTestImplementation "io.mockk:mockk-Android:1.8.13"
_を使用すると、モックは次のようになります。
_val mock: Foo = mockk()
// val mock: Foo = mockkClass(Foo::class) // also tried this
every { mock.getData() } returns listOf("1", "2", "3")
_
次のクラッシュが常に発生します。
_io.mockk.MockKException: Missing calls inside every { ... } block.
at io.mockk.impl.recording.states.StubbingState.checkMissingCalls(StubbingState.kt:14)
at io.mockk.impl.recording.states.StubbingState.recordingDone(StubbingState.kt:8)
at io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:42)
_
また、情報を収集しようとしました:
androidTest
モジュール内でFoo
を実行しています。同じクラッシュを得た@MockK
_およびMockKAnnotations.init(this)
を使用します。クラッシュしました。Log.d
_行の前とgetData()
メソッドの内部に_every {
_を追加しました。クラスの実際の実際のメソッドは、モックのセットアップ中に呼び出されるようです。それは私にはとても奇妙に思えます。ここで何が間違っているのでしょうか?
編集:
要求に応じて、完全なコード。私は現在、エラーを切り分けようとする隔離されたプロジェクトに取り組んでいるので、Fooは次のとおりです。
_class Foo {
fun getData(): String {
Log.d(TAG, "invoked foo.getData()")
return "trolololo"
}
}
_
androidTest
にFooTestがあります:
_class FooTest {
@Test
fun mock_foo() {
val foo = mockk<Foo>()
every { foo.getData() } returns "zero"
assertEquals("zero", foo.getData())
}
}
_
Mockkで未解決の問題のようです: https://github.com/mockk/mockk/issues/182
2つのクイックフィックス(pick one):
Foo
クラスをオープンとして設定します(また、モックするメソッドも)公式ガイド を確認して、不足しているものを確認してください。
私の場合、Kotlinで拡張機能をモックしようとしましたが、mockkStatic
fun Date.asMyTime() : DateTime = DateTime(this, DateTimeZone.getDefault())
mockkStatic("packageName.FileNameKt") // This is what I was missing
every {
DateTime().asMyTime()
} returns mock(DateTime::class.Java)