我一直在用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)。发生了一些崩溃
- 使用注解
@MockK
和MockKAnnotations.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())
}
}
9条答案
按热度按时间m528fe3b1#
这似乎是一个Mockk开放的问题:https://github.com/mockk/mockk/issues/182
2种可能的快速修复(选择一个):
1.在模拟器中运行仪器测试〉= Android-P
1.将
Foo
类设置为open(以及您想要模拟的方法)5ktev3wc2#
试着检查官方指南,看看遗漏了什么。
在我的例子中,我试图在Kotlin中模拟一个扩展,但错过了
mockkStatic
uplii1fm3#
在我的例子中,我忘记了将
every {...}
应用于spyk
的类。😳bvhaajcl4#
在我的例子中,我尝试使用mock()函数来模拟,而不是mockk()(double k)
kb5ga3dv5#
在我的情况下,我错过了
bnlyeluc6#
确保该对象实际上是一个模拟对象,而不是真正的对象。
例如:
yuvru6vn7#
我的问题是我使用了一个没有getter的java类
我需要为变量添加getter以使mocking工作:
q9yhzks08#
Mockk每个{...}块中的Missing调用
当你在一个不是mockk的对象上定义了一个
every
块时,也可能抛出,例如:您可以像这样定义存根行为
然后尝试:
其中
DATA
和VERSION
对象在测试类中声明(并示例化)。在这种情况下,错误消息的信息量不是很大,并且有点误导。
vojdkbi09#
像这样尝试