web-dev-qa-db-fra.com

Mockk Appels manquants dans chaque bloc {...}

Je suis coincé à essayer de me moquer de certaines choses avec mockk:

J'ai la configuration suivante sur 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

J'écris donc un androidTest pour le SDK et j'essaie de me moquer de Foo.kt. Il n'y a rien d'inhabituel dans la classe Foo, il suffit de diriger class Foo(private val someParams) {

Donc en utilisant androidTestImplementation "io.mockk:mockk-Android:1.8.13" La maquette va:

val mock: Foo = mockk()
// val mock: Foo = mockkClass(Foo::class) // also tried this
every { mock.getData() } returns listOf("1", "2", "3")

Je reçois toujours le crash suivant:

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)

A également essayé de recueillir des informations:

  • en cours d'exécution dans le dossier de test JVM. Il se moque sans problème, mais je ne peux pas exécuter mon test en tant que JVM
  • exécutant androidTest à l'intérieur du module Foo. J'ai le même crash
  • en utilisant mockkClass (Foo :: class). J'ai un crash
  • en utilisant l'annotation @MockK et MockKAnnotations.init(this). J'ai un crash.
  • ajouté Log.d avant la ligne every { et à l'intérieur de la méthode getData() et il semble que la vraie méthode réelle de la classe soit appelée lors de la simulation d'installation. Cela me semble super bizarre.

Une idée de ce qui ne va pas ici?

modifier:

comme demandé, code complet. Je travaille actuellement sur un projet isolé pour essayer d'isoler l'erreur, alors Foo est juste:

class Foo {

    fun getData(): String {
        Log.d(TAG, "invoked foo.getData()")
        return "trolololo"
    }

}

puis j'ai FooTest dans androidTest:

class FooTest {

    @Test
    fun mock_foo() {
        val foo = mockk<Foo>()
        every { foo.getData() } returns "zero"
        assertEquals("zero", foo.getData())
    }

}
10
Budius

Il semble que ce soit un problème ouvert pour Mockk: https://github.com/mockk/mockk/issues/182

2 solutions rapides possibles ( choisissez-en une ):

  1. Exécutez les tests instrumentés dans un émulateur> = Android-P
  2. Définissez la classe Foo comme étant ouverte (et la ou les méthodes que vous souhaitez également utiliser)
5
Phil

Essayez de vérifier le guide officiel et voyez ce qui manque.

Dans mon cas, j'ai essayé de se moquer d'une extension dans Kotlin mais j'ai manqué le 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