与Mockito一起在Kotlin中的模拟自动生成的固定器



假设我有以下接口:

internal interface IRegisters {
    var i: Short
    var pc: Int
    var sp: Int
}

现在,当我编译该界面时,公共字段将被Getters和Setter替换。我想最终结果并非完全是这个,但假设它是为了简单的原因:

internal interface IRegisters {
    fun getI(): Short
    fun setI(value: Short)
    fun getPc(): Int
    fun setPc(value: Int)
    fun getSp(): Int
    fun setSp(value: Int)
}

我的问题是:使用Mockito,我可以以以下方式模拟Getter部分:

Mockito.`when`(registersMock.sp).thenReturn(16)

我想在编译过程中的某个时刻在幕后替换了这样的事情:

Mockito.`when`(registersMock.getSp()).thenReturn(16)

我验证了这实际上是正确替换.thenReturn零件的.thenAnswer。呼叫答案的answer方法时的invocation.method确实是getSp

我的问题是:如何模拟(如果可能的话(set对应物?

我尝试了以下方法:

Mockito.`when`(registersMock.sp = ArgumentMatchers.anyInt()).then...

,但它告诉我作业不是表达式,并且在此上下文中仅允许表达。而且,由于setSp(value: Int)尚不存在,所以我也不能做以下内容:

Mockito.`when`(registersMock.setSp(ArgumentMatchers.anyInt())).then...

...因为它给出了未解决的参考错误(这是合理的,因为如果我尝试getSp()对应物,则行为是一致的(。

这是特别令人发指的,因为我可以使用=分配的setSp方法 verify 以下方法:

Mockito.verify(
    registersMock,
    times(1)
).sp = 0x300

预先感谢。

花了一段时间,但是我发现了一些工作。诀窍是交换 wheneverdoAnswer。例如,当调用设置器时,我可以提取传递的INT。工作解决方案:

源代码:

interface IRegisters {
 var sp: Int
}

测试中的模拟:


val mockIRegister = mock<IRegister>()
var lastSp: Int? = null
doAnswer { invocation -> 
 lastSp = invocation.getArgument(0) as? Int
}
 .whenever(mockIRegister)
 .sp = anyInt()

最新更新