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:
androidTest
à l'intérieur du module Foo
. J'ai le même crash@MockK
et MockKAnnotations.init(this)
. J'ai un crash.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())
}
}
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 ):
Foo
comme étant ouverte (et la ou les méthodes que vous souhaitez également utiliser)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)