You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mockk模拟Location.distanceBetween静态方法时遇未Mock错误求助

解决Mockk模拟Location.distanceBetween静态方法的问题

你的问题出在参数匹配逻辑上:你在every语句里用floatArrayOf()作为最后一个参数的匹配条件,但实际调用Location.distanceBetween时传入的是一个全新的FloatArray实例,和floatArrayOf()不是同一个对象,导致Mockk的匹配规则不触发,最终调用了未被mock的原生方法,抛出错误。

修正后的测试代码

把参数匹配器换成any<FloatArray>(),匹配任意FloatArray类型的参数,就能覆盖实际调用场景:

class DistanceUtilsTest {

    @Before
    fun setup() {
        MockKAnnotations.init(this)
        mockkStatic(Location::class)
        // 用any<FloatArray>()匹配任意FloatArray实例
        every { Location.distanceBetween(any(), any(), any(), any(), any<FloatArray>()) } answers  {
            lastArg<FloatArray>()[0] = 655138f
        }
    }

    @After
    fun tearDown() {
        unmockkStatic(Location::class)
    }

    @Test
    fun `Should calculate large distance without error`() {
        val actual = DistanceUtils.calculateDistanceInMiles(lat1 = 90.0, lng1 = 100.0, lat2 = 0.0, lng2 = 0.0)
        val expected = 655138f
        Assert.assertEquals(expected, actual)
    }
}

关键说明

  • any<FloatArray>()会匹配所有FloatArray类型的参数,不管传入的是哪个具体实例,这样就能确保mock逻辑被触发。
  • 在answers块里通过lastArg<FloatArray>()获取实际传入的数组,给第一个元素赋值,符合distanceBetween方法的原生逻辑(通过输出参数返回计算结果)。

内容的提问来源于stack exchange,提问作者toshiomagic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 03:51:06