未能将 Mockitos thenReturn 与谓词一起使用 - thenReturn 返回 404 而不是参数

问题描述

我正在尝试使用 Mockito 在测试中返回一些认值,但我得到了 404

我的测试:

@Test
fun `Should return 200,when sending a valid push notification`() {
    // Arrange
    Mockito.`when`(subscriptionStore.getSubscription{ it.peerID == validSubscription.peerID})
        .thenReturn(
            validSubscription
        )
    // Act
    val response = mockmvc.post("/push") {
        contentType = MediaType.APPLICATION_JSON
        content = objectMapper.writeValueAsstring(validPushMessage)
    }
    // Assert
    response.andDo { print() }
        .andExpect {
            status { isOk() }
        }
}

这是我尝试模拟的界面上的方法

interface SubscriptionStore {

    fun addSubscription(newSubscription: Subscription)

    fun getSubscriptions(): Collection<Subscription>

    fun getSubscription(predicate: (Subscription) -> Boolean): Subscription?
    fun deleteSubscription(peerID: String)
    fun updateSubscription(subscription: Subscription)

    class DuplicateElementException(msg: String) : Exception(msg)
}

这是模拟方法用法,它不返回我告诉它的内容,但给了我 404:

override fun push(pushMessage: PushMessage) {
    val recipientSubscription = subscribeService.getSubscription(pushMessage.recipient)
        ?: throw NoSuchElementException("Recipient not found")
}

从我的 subscriptionStore 调用

override fun getSubscription(PeerID: String): Subscription? = subscriptionStore.getSubscription { it.peerID == PeerID}

解决方法

在 Kotlin 中,具有相同代码的 2 个不同的 lambda 被认为是不相等的:

val fun1: (Int) -> Boolean = {it > 5}
val fun2: (Int) -> Boolean = {it > 5}
println(fun1 == fun2) // false

这就是你的存根失败的原因——你在测试中传递了不同的 lambda,而在实际代码中传递了不同的 lambda

回答原帖:我可能会放宽对谓词的存根要求并使用 ArgumentMatchers.any 参数匹配器

最重要的是 - 通过 ID 选择项目通常由 DB 作为单独的操作公开,因为它是到达元素的最快方式。也许它也值得添加到您的 API 中?