问题描述
我正在尝试使用 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 中?