如何解决未能将 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 中?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。