KotlinTest 与 Mockk 的并行性

KotlinTest parallelism with Mockk

所以我一直在将 kotlintest 与 mockk 结合使用,但是通过将其添加到 ProjectConfig class:

,在从单线程模式切换到多线程模式时遇到了问题
override fun parallelism(): Int = Runtime.getRuntime().availableProcessors()

如果我运行单人模式。我的所有测试都通过了,但就在我切换到并行性时,其中一些使用模拟的测试开始失败。

我有很多方法,比如:

override fun afterTest(testCase: TestCase, result: TestResult) {
    clearAllMocks()
}

所以我想像这样的方法可能会导致我的模拟失败,方法是在验证块之前清除所有模拟数据。

有没有办法强制不同线程上的测试使用它们自己的 Mockk 实例并强制 clearAllMocks() 方法只清除调用线程上的模拟? 如果不是,还有哪些其他代码实践可以帮助解决这些问题?

根据this issue in mockk repository,与另一个测试框架有关,clearAllMocks不能运行并行。

In case your tests get execute in parallel you are not able to use clearAllMocks

oleksiyp 于 2019 年 5 月 15 日发表评论

这可能是由于 mockk 将内容保存在内存中的方式,并且 clearAllMocks 无法正确(也许不应该)很好地处理竞争条件。

你可以做的是用 clearMocks:

单独清除每个模拟实例
override fun afterTest(testCase: TestCase, result: TestResult) {
    clearMocks(mockedInstance1, mockedInstance2, mockedInstance3)
}

它应该在运行并行

时工作