我被困在尝试用模拟来模拟一些东西:
我在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)
还试图收集信息:
androidTest
模块内运行Foo
。遇到了同样的崩溃@MockK
和MockKAnnotations.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())
}
}
答案 0 :(得分:6)
在我的情况下,我忘记了spyk
我正在申请every {...}
的课程。 ?
val presenter = spyk(MyPresenter())
every { view.myFun(any()) } returns Unit
答案 1 :(得分:3)
就我而言,我错过了
@Before
fun setUp() {
MockKAnnotations.init(this)
}
答案 2 :(得分:1)
这似乎是Mockk公开的问题:https://github.com/mockk/mockk/issues/182
2个可能的快速修复方法(选择一个):
Foo
类设置为开放类(以及您也要模拟的方法)答案 3 :(得分:1)
尝试检查official guide并查看缺少的内容。
就我而言,我尝试在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)
答案 4 :(得分:0)
确保对象确实是模拟对象,而不是真实对象。
例如:
- Sdk sdk = Sdk()
+ Sdk sdk = mockk()
every { sdk.crypto } returns mockk()
答案 5 :(得分:0)
在我的情况下,我尝试使用模拟()函数代替模拟 k ()(双k)
答案 6 :(得分:0)
试试这个
`when`(mock.getData()).thenReturn(listOf("1", "2", "3"))