假设我有以下接口:
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
预先感谢。
花了一段时间,但是我发现了一些工作。诀窍是交换 whenever
和 doAnswer
。例如,当调用设置器时,我可以提取传递的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()