如何用MockK指定同一方法在调用另一方法前后的不同行为?
解决MockK中按调用顺序指定方法返回值的问题
针对你需要让getStuff()在deleteStuff()前后返回不同结果的需求,MockK提供了几种直接的实现方式,以下是具体方案:
方案1:用returnsMany直接指定多轮返回值
如果明确知道getStuff()会被调用两次,且每次返回值固定,可以直接用returnsMany传入结果列表:
// 第一次调用返回创建的Stuff实例,第二次返回null(对应删除后的状态) coEvery { myService.getStuff() } returnsMany listOf(Stuff, null)
方案2:用andThen链式指定后续返回
这种写法更直观,适合按顺序定义每一次调用的返回:
coEvery { myService.getStuff() } returns Stuff andThen null
方案3:用answers自定义动态逻辑
如果需要更复杂的判断(比如根据调用次数、外部状态动态返回),可以用answers结合计数器实现:
var getStuffInvocationCount = 0 coEvery { myService.getStuff() } answers { getStuffInvocationCount++ // 第一次调用返回Stuff,后续调用返回null if (getStuffInvocationCount == 1) Stuff else null }
以上三种方案都能适配你的测试流程:createStuff→getStuff(返回创建的实例)→deleteStuff→getStuff(返回空/删除后的状态),根据你的实际业务场景选择即可。
内容的提问来源于stack exchange,提问作者ConfusedPenguin
相关产品推荐
相关产品推荐

