因为我需要在 Kotlin 中使用 Mockk 测试传递的发布函数参数是否正确
以下是代码:
val notificationData = NotificationData(
notificationId = "test-notificationID",
operation = "CREATE",
partnerName = "test-partner",
created = Instant.now().toEpochMilli().toString(),
services = []
)
verify(exactly = 1) { publish(notificationData) }
但是由于 notificationData 对象中创建的属性将在模拟和被调用函数中具有实时值,因此两者不匹配并给出以下错误
验证失败:调用第 1 个(共 1 个):publish(eq(NotificationData(notificationId=test-notificationId,partnerName=test-partner, operation=CREATE, mutatedAttributes=null, services=[],created=1633719398360))))。仅发生了一次对通知(对象通知)/发布(通知数据)的匹配调用,但参数不匹配: [0]:参数:NotificationData(notificationId = test-notificationId,partnerName = test-partner,操作= CREATE,mutatedAttributes = null,services = [],created = 1633719398404),匹配器:eq(NotificationData(notificationId = test-notificationId, PartnerName=测试合作伙伴,操作=CREATE,mutatedAttributes=null,服务=[],创建=1633719398360)),结果:-
任何人请帮我找出如何忽略“created”属性来获得测试成功
正如您打算测试的那样,似乎您也可以嘲笑
created
。因此,您不应使用 Instant.now().toEpochMilli().toString()
,而应为这些 created
添加时间 milis 值,例如
val notificationData = NotificationData(
notificationId = "test-notificationID",
operation = "CREATE",
partnerName = "test-partner",
created = "1633719398404",
services = []
)
编辑
似乎还有另一种方法可能会有所帮助,但相当需要努力,即在原来的类中注入
NotificationData
。所以,你可以在测试中嘲笑NotificationData
用mockk实现的方法是使用
match
verify(exactly = 1) { publish(match{ it == notificationData.copy(created=it.created) }) }
在这种特定情况下,您应该使用
clock
并将时钟注入被测对象中,这样您就可以执行类似的操作,这保证了时钟具有固定时间,并且您可以在验证中使用相同的固定时间。
val clock = Clock.fixed(Instant.now())
val underTest = Publisher(clock)
//perform action
val notificationData = NotificationData(
notificationId = "test-notificationID",
operation = "CREATE",
partnerName = "test-partner",
created = clock.instant().toEpochMilli().toString(),
services = []
)
verify(exactly = 1) { publish(notificationData) }
------
// publisher code
...
created = clock.instant()