web-dev-qa-db-ja.com

すべての{...}ブロック内のMockk欠落呼び出し

私は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)
_

また、情報を収集しようとしました:

  • jVMテストフォルダー内で実行します。問題なくモックされますが、JVMとしてテストを実行できません
  • androidTestモジュール内でFooを実行しています。同じクラッシュを得た
  • mockkClass(Foo :: class)を使用します。クラッシュした
  • 注釈_@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())
    }

}
_
10
Budius

Mockkで未解決の問題のようです: https://github.com/mockk/mockk/issues/182

2つのクイックフィックス(pick one):

  1. エミュレーターでインストルメント済みテストを実行する> = Android-P
  2. Fooクラスをオープンとして設定します(また、モックするメソッドも)
5
Phil

公式ガイド を確認して、不足しているものを確認してください。

私の場合、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)
5
Allen