我们说我有以下界面:
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)
我确认这实际上正确替换了.thenReturn
的{{1}}部分。确实在调用答案的.thenAnswer
方法时invocation.method
是answer
。
我的问题是:我如何模仿(如果可能的话)getSp
对应物?
我试过这个:
set
但它告诉我赋值不是表达式,在此上下文中只允许使用表达式。而且,由于Mockito.`when`(registersMock.sp = ArgumentMatchers.anyInt()).then...
尚未存在,我也无法执行以下操作:
setSp(value: Int)
...因为它提供了一个未解析的引用错误(这是合理的,因为如果我尝试Mockito.`when`(registersMock.setSp(ArgumentMatchers.anyInt())).then...
对应的行为是一致的。)
这是特别令人愤怒的,因为我可以通过以下方式使用getSp()
分配验证 setSp
方法:
=
提前致谢。
答案 0 :(得分:1)
花了一段时间,但我发现有些工作。诀窍是交换 whenever
和doAnswer
。
例如,我可以在调用setter时提取传入的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()