【问题标题】:KotlinTest parallelism with MockkKotlinTest 与 Mockk 的并行性
【发布时间】:2020-01-13 05:24:24
【问题描述】:

所以我一直在将 kotlintest 与 mockk 结合使用,但是通过将其添加到 ProjectConfig 类中从单线程模式切换到多线程时遇到了问题:

override fun parallelism(): Int = Runtime.getRuntime().availableProcessors()

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

我有各种各样的方法:

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

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

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

【问题讨论】:

  • 不幸的是,我不相信mockk 支持多线程和clearAllMockks。 A very similar issue 在 2019 年初为 Mockk 和 Spek 提出,解决方案只是“你不能将 clearAllMocks 与并行性一起使用”
  • 也许您可以在afterTest 清除单个模拟并逐个清除它们?
  • @Kerooker,是的,我最终用 clearMocks(mock1, mock2, mock3, etc..) 替换了 clearAllMockks,它现在似乎可以工作了。请留下正确的答案,以便我将其标记为已接受:)

标签: android mockk kotlintest


【解决方案1】:

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

如果您的测试并行执行,您将无法使用 clearAllMocks

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

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

您可以做的是使用clearMocks 单独清除每个模拟实例:

override fun afterTest(testCase: TestCase, result: TestResult) {
    clearMocks(mockedInstance1, mockedInstance2, mockedInstance3)
}

它应该在并行运行时工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2020-03-06
    • 2021-09-09
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多