【问题标题】:Cannot mock a method in mockito无法在 mockito 中模拟方法
【发布时间】:2021-07-12 06:10:20
【问题描述】:

我尝试模拟此函数,但 record 变量始终为空

这是服务中的代码:

val record: LockDatabaseRecord = lockDatabaseRecordService.getTransLockDbRecord(dbRecordId) {
    it.lockDatabaseRecordKeys.size
}

这就是我嘲笑它的方式

 @Test
    fun failedEngageSessionItem() {
        val dbVersion = "0x0000001"
        val sessionId = UUID.randomUUID()
        val dbRecordId = UUID.randomUUID()
        val requestDetails = "request details"
        val recordDbVersion = "1x"

        val lockId = UUID.randomUUID()
        val lock = mock(Lock::class.java)

        val lockDatabaseRecord = mock(LockDatabaseRecord::class.java)
        val lockDatabaseRecordKey = mock(LockDatabaseRecordKey::class.java)
        val key = mock(Key::class.java)

        `when`(lockService.getTransLock(eq(lockId), any())).thenReturn(lock)
                `when`(lockDatabaseRecordService.getTransLockDbRecord(eq(dbRecordId), any())).thenReturn(lockDatabaseRecord)

【问题讨论】:

  • lockDatabaseRecordService 也是模拟吗?必须如此,因为您在 when 语句中定义了它的行为
  • 是的!这是一个模拟
  • 在您的测试中,您似乎使用 2 个参数调用重载的 getTransLockDbRecord,但代码调用了 1 个参数版本。

标签: unit-testing kotlin mockito


【解决方案1】:

从您的称呼方式来看,getTransLockDbRecord 似乎接受两个参数(一个 id 和一个返回键大小的 lambda)。确保你完全按照它应该被调用的方式模拟它,包括 lambda 参数。

在 bitcode 中,这两个调用将调用两个不同的方法(带有重载签名),您需要确保调用正确的方法。

Mockito 也可能在比较 lambda 时遇到问题。如果模拟不起作用,我建议您先使用Mockito.any() 尝试它,以确保它能够模拟它。

`when`(lockDatabaseRecordService.getTransLockDbRecord(eq(dbRecordId), any()))
     .thenReturn(lockDatabaseRecord)

【讨论】:

  • 嗨!我在上面尝试了您的代码,但由于某种原因,它返回eq(dbRecordId) must not be null。你知道是什么原因吗? :想想:
  • @mengmeng 你确定dbRecordId 在你的情况下不为空吗?你能仔细检查一下吗?
  • 是的。 dbRecordId 只是 val dbRecordId = UUID.randomUUID() hmmm
  • @mengmeng 能发个完整的sn-p代码吗?
  • @mengmeng 你也可以发布你得到的确切错误吗?它产生了哪一行代码?
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
相关资源
最近更新 更多