0

我正在尝试使用 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")
}

从我的订阅商店调用它

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

1 回答 1

1

在 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 中?

于 2021-07-02T11:01:18.823 回答