You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MockK如何为每个测试重置Mock?含relaxed类型Mock场景

解决方案:MockK支持测试前重置Relaxed Mock

当然支持啦!MockK提供了几种优雅的方式来实现每个测试用例执行前重置Mock的需求,针对你提到的relaxed = true的场景,我给你整理了两种常用方案:

方案一:用@RelaxedMockK注解替代手动创建

如果你想摆脱手动创建Mock的代码,同时保留relaxed特性,MockK专门提供了@RelaxedMockK注解,完美解决@Mock不支持设置relaxed = true的问题:

  1. 在测试类中用注解声明Mock:
@RelaxedMockK lateinit var someService: SomeService
  1. 配合测试框架的前置方法(比如JUnit 5的@BeforeEach、JUnit 4的@Before)初始化并重置Mock:
@BeforeEach
fun setup() {
    MockKAnnotations.init(this)
}

每次执行测试前,MockKAnnotations.init(this)会自动重置Mock的状态,清空所有交互记录,回到初始的relaxed状态。

如果你用的是JUnit 5,更推荐直接使用MockK扩展,连手动初始化都省了:

@ExtendWith(MockKExtension::class)
class YourTestClass {
    @RelaxedMockK lateinit var someService: SomeService

    // 测试用例...
}

这个扩展会自动在每个测试前处理Mock的初始化和重置,非常省心。

方案二:保留手动创建的Mock,手动重置

如果你更习惯手动用mockk<SomeService>(relaxed = true)创建Mock,也可以通过clearMocks()方法在测试前重置状态:

  1. 先在测试类中声明Mock(注意如果用val,要确保是类级别的变量):
private val someService = mockk<SomeService>(relaxed = true)
  1. 在前置方法中调用clearMocks():
@BeforeEach
fun setup() {
    clearMocks(someService)
}

clearMocks()会清空该Mock的所有调用记录、验证状态,让它回到初始的relaxed状态,完全满足你每个测试用例前重置的需求。

两种方案都能完美解决你的问题,你可以根据自己的编码习惯选择~

内容的提问来源于stack exchange,提问作者jc12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:18:57