web-dev-qa-db-ja.com

Kotlin Mockkエラー:verify {...}ブロック内に呼び出しがありません

このエラーメッセージまたは同様のエラーメッセージのいくつかの問題をすでに読みました(これはすべての{}でも発生します)が、いずれも私を成功に導きませんでした。

これを機能させるためのヒントや提案はありますか?

ここに私のセットアップとユニットテスト自体があります:

_compileSdkVersion 29
defaultConfig {
   minSdkVersion 19
   targetSdkVersion 29
   testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

MockK version: 1.9.3.kotlin12
OS: Android
Kotlin version: 1.3.61
JDK version: jdk1.8.0_212
JUnit version: 4.12
Type of test: unit test
_

エラーのスタックトレース:

_io.mockk.MockKException: Missing calls inside verify { ... } block.

    at io.mockk.impl.recording.states.VerifyingState.checkMissingCalls(VerifyingState.kt:52)
    at io.mockk.impl.recording.states.VerifyingState.recordingDone(VerifyingState.kt:21)
    at io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:47)
    at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:60)
    at io.mockk.impl.eval.VerifyBlockEvaluator.verify(VerifyBlockEvaluator.kt:30)
    at io.mockk.MockKDsl.internalVerify(API.kt:118)
    at io.mockk.MockKKt.verify(MockK.kt:139)
    at io.mockk.MockKKt.verify$default(MockK.kt:136)
_

私の単体テスト:

_@Test
fun logout_clearsDatabase() {
    coroutineTestRule.testDispatcher.runBlockingTest {

        // ARRANGE
        database.dataDao().insert(listOf(DataDummies()))

        // ACT
        sut.logout()

        // ASSERT
        verify { database.clearAllTables() }
    }
}
_

私がここで間違ったことをする手がかりはありません。 database.clearAllTables()は、Roomが提供するメソッドです。 testDispatcherは、androidxテストライブラリによって提供されるTestCoroutineDispatcher()です。

更新/回答

@Juan Cruy Solerの入力のおかげで、データベースへの注入方法を変更しました。実際の部屋のデータベースは返さず、代わりにそのスパイを返しました。このようにして、スパイがSUTと私のテストクラスに注入されます。その変更後、テストは期待どおりに実行されます。私はこれが私の問題の実行可能な解決策ですか? (Testing-)DependencyInjectionにスパイを作成させることは理にかなっていますか?

3
muetzenflo

実際のシナリオをシミュレートするには、スカイプを使用する必要があります。

val database = spyk<YouDataBaseReference>()

そうすることで、関数を使用できるようになります。

0
Jhonatan Sabadi