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

我在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

因此,我正在为SDK编写androidTest并尝试模拟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")

我总是遇到以下崩溃:
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)

还试图收集信息:
  • 在JVM测试文件夹中运行。它被 mock 没有问题,但是我不能以JVM
  • 的身份运行测试
  • androidTest模块中运行Foo。遇到了相同的崩溃
  • 使用mockkClass(Foo::class)的
  • 。有一些崩溃
  • 使用注释@MockKMockKAnnotations.init(this)。有一些崩溃。
  • Log.d行之前和every {方法内部添加了getData(),看来在模拟设置期间将调用该类的实际方法。这对我来说似乎很奇怪。

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

    编辑:

    根据要求,完整代码。我目前正在开发一个隔离的项目,以尝试隔离错误,因此Foo只是:
    class Foo {
    
        fun getData(): String {
            Log.d(TAG, "invoked foo.getData()")
            return "trolololo"
        }
    
    }
    

    然后我在androidTest中有FooTest:
    class FooTest {
    
        @Test
        fun mock_foo() {
            val foo = mockk<Foo>()
            every { foo.getData() } returns "zero"
            assertEquals("zero", foo.getData())
        }
    
    }
    

    最佳答案

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

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

  • 在> = Android-P
  • 的模拟器中运行检测测试
  • Foo类设置为open(以及您也要模拟的方法)
  • 07-27 20:38