使用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
相关产品推荐
相关产品推荐

