Stubbing 方向配置 Android mockK 中的资源

Stubbing orientation configuration Android Resources in mockK

我正在尝试使用 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

我不太确定为什么要这么说,因为它是一个轻松的模拟。有人见过这个吗?我很难在网上找到任何提到如何使用 mockk 存根资源和配置的内容。

这是Java-Kotlin interop for getters and setters隐藏底层实现的案例:

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
            }
        }
    }