每个{...}块中都存在Mockk缺失呼叫

Bud*_*ius 11 android mocking kotlin mockk

我被困在尝试用模拟嘲笑一些东西:

我在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
Run Code Online (Sandbox Code Playgroud)

所以我正在androidTest为SDK 编写一个并尝试进行模拟Foo.kt。Foo类没有什么不寻常的,只是直接的class Foo(private val someParams) {

因此,使用androidTestImplementation "io.mockk:mockk-android:1.8.13"模拟去:

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

我总是遇到以下崩溃:

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)
Run Code Online (Sandbox Code Playgroud)

还试图收集信息:

  • 运行在JVM测试文件夹中。它被嘲笑而没有问题,但是我无法以JVM的身份运行测试
  • androidTestFoo模块内部运行。遇到了同样的崩溃
  • 使用mockkClass(Foo :: class)。有一些崩溃
  • 使用注释@MockKMockKAnnotations.init(this)。有一些崩溃。
  • Log.devery {line和inside getData()方法之前添加,似乎在模拟设置过程中调用了该类的实际方法。这对我来说似乎很奇怪。

知道这里出了什么问题吗?

编辑:

根据要求,完整代码。我目前正在研究一个隔离的项目,以尝试隔离错误,所以Foo只是:

class Foo {

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

}
Run Code Online (Sandbox Code Playgroud)

然后我在FooTest中androidTest

class FooTest {

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

}
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 10

就我而言,我忘记spyk了我正在申请的课程every {...}

val presenter = spyk(MyPresenter())

every { view.myFun(any()) } returns Unit
Run Code Online (Sandbox Code Playgroud)

  • @AkshayHazari `spyk` 用于向“真实”对象添加模拟和验证功能。任何可以用“mockk”完成的事情都可以在“spyk”对象上完成,例如“every{}”、“verify{}”等。 (4认同)

小智 7

就我而言,我错过了

@Before
fun setUp() {
    MockKAnnotations.init(this)
}
Run Code Online (Sandbox Code Playgroud)


Ser*_*kin 7

在我的例子中,我尝试使用mock()函数来模拟,而不是mock k ()(double k)


Phi*_*hil 5

似乎是Mockk公开的问题:https : //github.com/mockk/mockk/issues/182

2种可能的快速修复方法(选择一种):

  1. 在>> Android-P的模拟器中运行检测测试
  2. Foo类设置为开放(以及您也要模拟的方法)


All*_*len 5

尝试查看官方指南,看看有什么遗漏。

就我而言,我尝试在Kotlin中模拟扩展程序,但错过了 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)
Run Code Online (Sandbox Code Playgroud)


app*_* 27 5

确保该对象确实是一个模拟对象,而不是真实的对象。

例如:

- Sdk sdk = Sdk()
+ Sdk sdk = mockk()
  every { sdk.crypto } returns mockk()
Run Code Online (Sandbox Code Playgroud)