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

使用MockK模拟Android Surface对象时isValid()返回无效的问题排查

解决MockK模拟Surface.isValid()不生效的问题

你遇到的问题核心是mock配置的对象和实际传入的对象不匹配,导致你的isValid()返回值设置没有生效。

问题分析

你当前的代码中,用@MockK注解创建了mockSurface实例,但却给anyConstructed<Surface>().isValid()配置返回值——这个配置只对通过Surface构造函数创建的实例生效,而@MockK生成的mock对象是直接由MockK创建的代理,并不会走Surface的构造函数,所以你的设置根本没作用到实际传入的mockSurface上。

另外,mockkConstructor(Surface::class)在这里完全是多余的,因为你并没有通过构造函数去创建需要mock的Surface实例。

修正后的代码

把配置改成直接针对mockSurface实例即可,修改后的测试代码如下:

private lateinit var mymonitor : Monitor
@MockK
private lateinit var mockContext : Context
@MockK
private lateinit var mockSurface : Surface

@Before
fun setup() {
    init(this, relaxed = true)
    // 去掉不必要的mockkConstructor(Surface::class)
    mockkConstructor(Monitor::class) // 如果Monitor的构造逻辑需要mock才保留,否则也可以去掉
    every { anyConstructed<Monitor>().getApplicationContext() } returns mockContext
    // 直接给mockSurface配置isValid的返回值
    every { mockSurface.isValid() } returns true
    mymonitor = spyk(Monitor())
    mymonitor.init(mockContext, mockSurface)
}

额外说明

  • Android的Surface是final类,MockK默认支持mock final类,不需要额外配置(只要你的MockK版本支持,一般新版本都没问题)。
  • 如果你的Monitor类不需要mock构造逻辑,mockkConstructor(Monitor::class)和spyk(Monitor())可以简化成直接实例化:mymonitor = Monitor(),这样测试代码会更简洁。

这样修改后,当init方法调用mockSurface.isValid()时,就会返回你设置的true,日志就会显示"Surface is valid..."了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 01:37:28