web-dev-qa-db-fra.com

Erreur Kotlin Mockk: appels manquants dans le bloc verify {...}

J'ai déjà lu quelques problèmes avec ceci ou un message d'erreur similaire (cela se produit également pour chaque {}), mais aucun d'entre eux ne m'a conduit à un résultat réussi.

Des conseils ou des suggestions sur la façon de faire fonctionner cela?

Voici ma configuration et le test unitaire lui-même:

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

Le stacktrace de l'erreur:

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)

Mon test unitaire:

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

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

        // ACT
        sut.logout()

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

Je n'ai aucune idée de ce que j'ai fait de mal ici. database.clearAllTables() est une méthode fournie par Room. Le testDispatcher est une TestCoroutineDispatcher() fournie par la bibliothèque de test androidx.

MISE À JOUR/RÉPONSE

Grâce à l'apport de @Juan Cruy Soler, j'ai changé la manière d'injecter la base de données. Je n'ai pas retourné la base de données de la salle réelle, à la place j'en ai renvoyé un espion. De cette façon, l'espion est injecté dans le SUT ainsi que dans ma classe de test. Après cette modification, le test s'exécute comme prévu. Est-ce une solution réalisable à mon problème? Est-il judicieux de laisser (Testing-) DependencyInjection créer un espion?

3
muetzenflo

Vous devez utiliser skype pour simuler un scénario réel.

val database = spyk<YouDataBaseReference>()

En faisant cela, vous pourrez utiliser des fonctions.

0
Jhonatan Sabadi