mockK中的Stubbing定向配置Android资源



我正试图使用MockK在Resources上截取Configuration实例的orientation值,这样我就可以在我的应用程序中测试一些横向与纵向行为。

不幸的是,我遇到了一些我从未见过的轻松模仿。

import android.content.res.Configuration
import android.content.res.Resources
...
@Test
fun `When behavior, verify result based on orientation`() {
val resources = mockk<Resources>(relaxed = true) {
every { configuration } returns mockk(relaxed = true) {
every { orientation } returns Configuration.ORIENTATION_LANDSCAPE // Line 36, see stack trace
}
}
...
}

第36行抛出此异常:

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:47)
at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:60)
at io.mockk.impl.eval.EveryBlockEvaluator.every(EveryBlockEvaluator.kt:30)
at io.mockk.MockKDsl.internalEvery(API.kt:92)
at io.mockk.MockKKt.every(MockK.kt:98)
at com.my.app.OrientationTests.When behavior, verify result based on orientation(OrientationTests.kt:36)
...

Process finished with exit code 255

我真的不知道它为什么这么说,因为这是一个轻松的模仿。有人看到这个吗?我很难在网上找到任何提到如何使用mock存根资源和配置的内容。

这是Java Kotlin interop的一个例子,用于getter和setter隐藏底层实现:

configuration实际上是Resources.getConfiguration()(方法调用(,而orientationConfiguration.orientation(Java字段,而不是方法调用(。

尽管从Kotlin方面看它们是一样的,但第二个every失败了,因为orientation不是一个可以模拟的方法调用。

在这种情况下,orientation可以在没有every:的情况下直接设置

@Test
fun `When behavior, verify result based on orientation`() {
val resources = mockk<Resources> {
every { configuration } returns mockk {
orientation = Configuration.ORIENTATION_LANDSCAPE
}
}
}

最新更新