如何用Mockk模拟Spring Data Repository的saveAll()方法?
解决Mockk模拟Spring Data saveAll时的参数匹配问题
你之前的写法错误在于把any()直接放在listOf()里——Mockk的参数匹配器不能这么嵌套使用,listOf()是普通Kotlin函数,Mockk无法识别这种方式定义的匹配规则,所以会报签名匹配失败。
要实现匹配包含2个任意Item元素的List且不创建真实实例,用Mockk的match匹配器或者内置的集合匹配器就能搞定,两种写法如下:
写法1:自定义匹配逻辑
用match直接断言List的大小和元素类型:
every { itemRepository.saveAll(match { list: List<Item> -> list.size == 2 && list.all { it is Item } }) } returns listOf(mockk<Item>(), mockk<Item>())
写法2:用Mockk内置集合匹配器
结合hasSize和all匹配器,代码更简洁:
import io.mockk.every import io.mockk.mockk import io.mockk.matchers.hasSize import io.mockk.matchers.all every { itemRepository.saveAll(hasSize<List<Item>>(2) and all { isInstanceOf<Item>() }) } returns listOf(mockk(), mockk())
两种写法都能精准匹配业务代码中传入的含2个Item的List,同时返回模拟的Item对象,完全不需要创建真实的Item实例,既精简测试代码又提升运行速度。
内容的提问来源于stack exchange,提问作者xetra11
相关产品推荐
相关产品推荐

