如何使用 Mockk 的 verify 方法忽略对函数中传递的参数之一属性的测试

问题描述 投票:0回答:2

因为我需要在 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”属性来获得测试成功

kotlin mockk-verify
2个回答
0
投票

正如您打算测试的那样,似乎您也可以嘲笑

created
。因此,您不应使用
Instant.now().toEpochMilli().toString()
,而应为这些
created
添加时间 milis 值,例如

val notificationData = NotificationData(
                notificationId = "test-notificationID",
                operation = "CREATE",
                partnerName = "test-partner",
                created = "1633719398404",
                services = []
            )

编辑

似乎还有另一种方法可能会有所帮助,但相当需要努力,即在原来的类中注入

NotificationData
。所以,你可以在测试中嘲笑
NotificationData


0
投票

用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()

© www.soinside.com 2019 - 2024. All rights reserved.