Kotlin中使用Mockk匹配列表时忽略元素顺序的实现方法
Mockk匹配不考虑顺序的列表参数解决方案
Mockk提供了多种方式实现不考虑元素顺序的列表参数匹配,以下是具体优化方案:
方案1:使用内置containAll匹配器
containAll是Mockk专门用来匹配“包含指定所有元素”的集合匹配器,不关心元素顺序,代码优化如下:
val mockIds = mocks.map { it.id } every { bugRepository.fetchAll(containAll(mockIds)) } returns mocks
注意:该匹配器允许传入的列表包含额外元素,只要覆盖所有期望的id即可。
方案2:严格匹配元素(数量+内容一致,仅顺序无关)
如果需要确保传入的列表和期望列表元素完全一致(只是顺序不同,不能多也不能少),可以结合matches匹配器,通过排序或转集合的方式比较:
方式A:排序后比较
val expectedSortedIds = mocks.map { it.id }.sorted() every { bugRepository.fetchAll(matches { it.sorted() == expectedSortedIds }) } returns mocks
方式B:转Set比较(适用于无重复id场景)
如果你的id不会重复,可以转成Set来忽略顺序:
val expectedIdSet = mocks.map { it.id }.toSet() every { bugRepository.fetchAll(matches { it.toSet() == expectedIdSet }) } returns mocks
内容的提问来源于stack exchange,提问作者Aleš Zrak
相关产品推荐
相关产品推荐

