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()
(方法调用),而 orientation
是 Configuration.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
}
}
}
我正在尝试使用 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()
(方法调用),而 orientation
是 Configuration.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
}
}
}