android Mockk每个{...}块中的Missing调用

axr492tv  于 2023-03-27  发布在  Android
关注(0)|答案(9)|浏览(91)

我一直在用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

所以我为SDK写了一个androidTest,并试图模拟Foo.kt
因此,使用androidTestImplementation "io.mockk:mockk-android:1.8.13",mock如下:

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测试文件夹中运行。它被嘲笑没有问题,但我不能运行我的测试作为JVM
  • Foo模块中运行androidTest。出现相同的崩溃
  • 使用mockClass(Foo::class)。发生了一些崩溃
  • 使用注解@MockKMockKAnnotations.init(this)。发生了一些崩溃。
  • every {行之前和getData()方法内部添加了Log.d,似乎在模拟设置期间调用了类中的真实的方法。这对我来说似乎超级奇怪。

你知道出了什么问题吗?

编辑:

我目前正在一个孤立的项目上工作,试图隔离错误,所以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())
    }

}
m528fe3b

m528fe3b1#

这似乎是一个Mockk开放的问题:https://github.com/mockk/mockk/issues/182
2种可能的快速修复(选择一个):
1.在模拟器中运行仪器测试〉= Android-P
1.将Foo类设置为open(以及您想要模拟的方法)

5ktev3wc

5ktev3wc2#

试着检查官方指南,看看遗漏了什么。
在我的例子中,我试图在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)
uplii1fm

uplii1fm3#

在我的例子中,我忘记了将every {...}应用于spyk的类。😳

val presenter = spyk(MyPresenter())

every { view.myFun(any()) } returns Unit
bvhaajcl

bvhaajcl4#

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

kb5ga3dv

kb5ga3dv5#

在我的情况下,我错过了

@Before
fun setUp() {
    MockKAnnotations.init(this)
}
bnlyeluc

bnlyeluc6#

确保该对象实际上是一个模拟对象,而不是真正的对象。
例如:

- Sdk sdk = Sdk()
+ Sdk sdk = mockk()
  every { sdk.crypto } returns mockk()
yuvru6vn

yuvru6vn7#

我的问题是我使用了一个没有getter的java类

public class KeyStorePasswordPair {
    public KeyStore keyStore;
    public String keyPassword;

    public KeyStorePasswordPair(KeyStore keyStore, String keyPassword) {
        this.keyStore = keyStore;
        this.keyPassword = keyPassword;
    }
}

我需要为变量添加getter以使mocking工作:

public class KeyStorePasswordPair {
    public KeyStore getKeyStore() {
        return keyStore;
    }

    public String getKeyPassword() {
        return keyPassword;
    }

    private KeyStore keyStore;
    private String keyPassword;

    public KeyStorePasswordPair(KeyStore keyStore, String keyPassword) {
        this.keyStore = keyStore;
        this.keyPassword = keyPassword;
    }
}
q9yhzks0

q9yhzks08#

Mockk每个{...}块中的Missing调用
当你在一个不是mockk的对象上定义了一个every块时,也可能抛出,例如:
您可以像这样定义存根行为

every { foo.getData() } returns DATA

然后尝试:

every { DATA.getVersion() } returns VERSION

其中DATAVERSION对象在测试类中声明(并示例化)。
在这种情况下,错误消息的信息量不是很大,并且有点误导。

vojdkbi0

vojdkbi09#

像这样尝试

`when`(mock.getData()).thenReturn(listOf("1", "2", "3"))

相关问题