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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:24:07