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

