Je suis coincé en essayant 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'essaye de me moquer de Foo.kt. Il n'y a rien d'inhabituel dans la classe Foo, juste direct class Foo(private val someParams) {

Donc, en utilisant androidTestImplementation "io.mockk:mockk-android:1.8.13", la simulation 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)

Également essayé juste de recueillir des informations:

  • s'exécutant 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écution de androidTest dans le 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 eu un crash.
  • a ajouté Log.d avant la ligne every { et à l'intérieur de la méthode getData() et il semble que la méthode réelle de la classe soit appelée lors de la configuration fictive. 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, donc Foo est juste:

class Foo {

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

}

Et 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())
    }

}
13
Budius 20 nov. 2018 à 14:04

3 réponses

Meilleure réponse

Cela semble être un problème ouvert par Mockk: https://github.com/mockk/mockk/issues/ 182

Deux 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 ouverte (et la ou les méthodes que vous souhaitez simuler également)
8
Phil 24 déc. 2018 à 17:07

Dans mon cas, j'ai oublié de spyk le cours auquel je postulais every {...}. 😳

val presenter = spyk(MyPresenter())

every { view.myFun(any()) } returns Unit
0
Tom 2 avril 2020 à 22:45

Essayez de consulter le guide officiel et voyez ce qui manque.

Dans mon cas, j'ai essayé de me moquer d'une extension à Kotlin mais j'ai raté 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)
6
Allen 17 mai 2019 à 13:25