使用Mockito模拟Kotlin接口自动生成的Setter方法
别担心,模拟Kotlin内部接口自动生成的Setter方法其实和处理Getter一样简单,Mockito完全支持这类方法的 stubbing 和验证。我给你拆解几个常见场景的实现方式:
1. Stubbing Setter方法(设置行为)
因为Setter方法通常是void返回类型,我们可以用doNothing()来指定当Setter被调用时的行为(这也是Mockito对void方法的默认处理,显式写出来会更清晰)。比如:
// 先创建IRegisters的mock实例 val registersMock = mock(IRegisters::class.java) // 模拟setI方法,不管传入什么Short值都无操作 doNothing().`when`(registersMock).setI(anyShort()) // 也可以针对特定参数做特殊处理,比如传入特定值时抛出异常(虽然Setter很少这么用,但示例一下) doThrow(IllegalArgumentException::class.java).`when`(registersMock).setPc(9999)
2. 验证Setter方法是否被调用
如果你需要验证代码是否正确调用了某个Setter,直接用verify()方法即可,和验证普通方法逻辑一致:
// 验证setSp方法被调用了一次,且参数是100 verify(registersMock, times(1)).setSp(100) // 用参数匹配器验证任意Int值的调用 verify(registersMock).setPc(anyInt()) // 验证某个Setter从未被调用 verify(registersMock, never()).setI(anyShort())
3. 完整示例代码
这里给你一个完整的测试代码片段,涵盖创建mock、stub、调用和验证全流程:
import org.junit.Test import org.mockito.Mockito.* class RegistersTest { @Test fun testRegistersSetterBehavior() { // 创建mock实例 val registers = mock(IRegisters::class.java) // Stub setI方法,指定特定参数的行为 doNothing().`when`(registers).setI(5) // 模拟被测代码的调用逻辑 registers.setI(5) registers.setPc(1234) // 验证Setter方法的调用情况 verify(registers).setI(5) verify(registers).setPc(1234) } }
关于Kotlin Internal接口的小提示
因为你的接口是internal的,测试代码可能会出现访问受限的问题,解决这个问题的简单方法有两种:
- 在主模块的
build.gradle.kts中添加配置,允许测试模块访问内部成员:
kotlin { sourceSets { main { kotlin.srcDir("src/main/kotlin") } test { kotlin.srcDir("src/test/kotlin") configurations.testImplementation.get().extendsFrom(configurations.compileOnly.get()) } } }
- 或者在测试文件顶部添加注解,抑制访问警告:
@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
这样就能正常使用Mockito模拟你的内部接口了。
内容的提问来源于stack exchange,提问作者S_Luis
相关产品推荐
相关产品推荐

