【发布时间】:2018-04-24 11:17:49
【问题描述】:
假设我有以下界面:
internal interface IRegisters {
var i: Short
var pc: Int
var sp: Int
}
现在,当我编译该接口时,公共字段将替换为 getter 和 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)
我验证了用.thenAnswer 替换.thenReturn 部分实际上是正确的。调用answer 方法时的invocation.method 确实是getSp。
我的问题是:我如何模拟(如果可能的话)set 对应对象?
我试过这个:
Mockito.`when`(registersMock.sp = ArgumentMatchers.anyInt()).then...
但它告诉我赋值不是表达式,在这种情况下只允许使用表达式。而且,由于setSp(value: Int) 尚不存在,我也无法执行以下操作:
Mockito.`when`(registersMock.setSp(ArgumentMatchers.anyInt())).then...
...因为它给出了一个 unresolved reference 错误(这是合理的,因为如果我尝试 getSp() 对应的行为是一致的)。
这特别令人生气,因为我可以通过以下方式使用= 赋值验证 setSp 方法:
Mockito.verify(
registersMock,
times(1)
).sp = 0x300
提前致谢。
【问题讨论】: