用Mockito模拟Kotlin自动生成的二传手

时间:2018-04-24 11:17:49

标签: kotlin mockito

我们说我有以下界面:

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.methodanswer

我的问题是:我如何模仿(如果可能的话)getSp对应物?

我试过这个:

set

但它告诉我赋值不是表达式,在此上下文中只允许使用表达式。而且,由于Mockito.`when`(registersMock.sp = ArgumentMatchers.anyInt()).then... 尚未存在,我也无法执行以下操作:

setSp(value: Int)

...因为它提供了一个未解析的引用错误(这是合理的,因为如果我尝试Mockito.`when`(registersMock.setSp(ArgumentMatchers.anyInt())).then... 对应的行为是一致的。)

这是特别令人愤怒的,因为我可以通过以下方式使用getSp()分配验证 setSp方法:

=

提前致谢。

1 个答案:

答案 0 :(得分:1)

花了一段时间,但我发现有些工作。诀窍是交换 wheneverdoAnswer。 例如,我可以在调用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()