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

如何使用Mockito 4模拟KeyGenParameterSpec.Builder类的构造方法?

使用Mockito 4模拟Builder类构造方法的方案

针对你给出的KeyGenParameterSpec.Builder场景,Mockito 4可以通过mockConstruction方法直接拦截并模拟类的构造逻辑,具体实现如下:

核心实现代码

import org.junit.jupiter.api.Test
import org.mockito.Mockito.mockConstruction
import org.mockito.kotlin.mock
import org.mockito.kotlin.whenever
import android.security.keystore.KeyGenParameterSpec

class BuilderMockTest {

    @Test
    fun mockBuilderConstructor() {
        val alias = "some string"
        val purpose = 1

        // 拦截Builder的构造过程,自定义其行为
        mockConstruction(KeyGenParameterSpec.Builder::class.java) { builder, _ ->
            // 预先mock好KeyGenParameterSpec实例,指定build()方法的返回值
            val mockSpec = mock<KeyGenParameterSpec>()
            whenever(builder.build()).thenReturn(mockSpec)
        }.use {
            // 执行业务代码,此时Builder的构造已被mock拦截
            val builder = KeyGenParameterSpec.Builder(alias, purpose)
            val spec = builder.build()

            // 这里可以添加验证逻辑,比如断言spec是我们预先mock的实例
            // assertSame(mockSpec, spec)
        }
    }
}

关键说明

  • mockConstruction的作用:这个方法会拦截目标类的所有构造调用,返回的MockConstruction实例需用use块包裹,确保自动释放资源,避免内存泄漏。
  • 自定义Builder行为:在lambda参数中可以拿到构造出的Builder mock实例,直接对其方法(比如build())进行stub,指定返回值。
  • 验证构造参数:如果需要验证构造时传入的参数是否正确,可以通过lambda的第二个参数context获取,比如context.arguments能拿到构造时的alias和purpose。

简化场景示例

如果只是需要mock Builder的构造,不需要提前定义build()的返回值,也可以在use块中直接处理:

mockConstruction(KeyGenParameterSpec.Builder::class.java).use { construction ->
    val builder = KeyGenParameterSpec.Builder(alias, purpose)
    val mockSpec = mock<KeyGenParameterSpec>()
    whenever(builder.build()).thenReturn(mockSpec)
    
    // 后续业务逻辑
}

注意事项

  • 建议配合mockito-kotlin库使用,简化Kotlin中的Mockito语法(比如whenever、mock方法)。
  • mockConstruction是Mockito 3.5版本后新增的特性,Mockito 4完全兼容,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:08:20