我一直试图用 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
所以我正在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")
我总是遇到以下崩溃:
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 运行我的测试
- 在模块
androidTest
内部运行。Foo
遇到同样的崩溃 - 使用 mockkClass(Foo::class)。发生了一些崩溃
- 使用注释
@MockK
和MockKAnnotations.init(this)
. 发生了一些崩溃。 Log.d
在every {
line 和 inside方法之前添加getData()
,似乎在模拟设置期间调用了类中的实际真实方法。这对我来说似乎非常奇怪。
知道这里出了什么问题吗?
编辑:
根据要求,完整代码。我目前正在研究一个孤立的项目以尝试隔离错误,所以 Foo 只是:
class Foo {
fun getData(): String {
Log.d(TAG, "invoked foo.getData()")
return "trolololo"
}
}
然后我有FooTest androidTest
:
class FooTest {
@Test
fun mock_foo() {
val foo = mockk<Foo>()
every { foo.getData() } returns "zero"
assertEquals("zero", foo.getData())
}
}