【问题标题】:Mock auto-generated setter in Kotlin with Mockito使用 Mockito 在 Kotlin 中模拟自动生成的设置器
【发布时间】: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

提前致谢。

【问题讨论】:

    标签: kotlin mockito


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多