首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlintest与Mockk如何清除校验计数

Kotlintest与Mockk如何清除校验计数
EN

Stack Overflow用户
提问于 2019-12-22 07:01:01
回答 3查看 6.9K关注 0票数 5

因此,我有以下代码:

代码语言:javascript
复制
When("SMS with location update command is received") {
        every {
            context.getString(R.string.location_sms, any(), any(), any(), any())
        } returns "loc"
        mainServiceViewModel.handleSms(SmsMessage("123", "location"))

        Then("SMS with location is sent to specified phone number") {
            verify(exactly = 1) {
                smsRepository.sendSms("+123", "loc")
            }
        }
    }

    When("motion is detected") {

        Then("information SMS is sent to specified phone number") {
            verify(exactly = 1) {
                smsRepository.sendSms("+123", any())
            }
        }
    }

问题是,这两种情况都过去了,即使第二种情况不采取任何行动。我预计第二种情况会失败,因为sendSms方法甚至没有被调用。

  1. 如何重置smsRepository校验计数?
  2. 在每一次案件发生之前,如何重设计数?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-23 13:16:40

这可能是因为KotlinTest在被认为是测试的内容和创建Spec实例时与JUnit不同。

KotlinTest的默认行为是在每次执行时创建Spec的单个实例。由于这个原因,您的模拟程序不会在执行之间重新设置,因为您可能是在class level中创建它们的。

要解决这个问题,您可以做的是在测试中执行mockk,或者在每次执行测试时将隔离模式更改为创建Spec

默认的isolationModeIsolationMode.SingleInstance。您可以通过重写Spec函数在isolationMode本身上更改它:

代码语言:javascript
复制
class MySpec : BehaviorSpec() {

    init {
        Given("XX") { 
            Then("YY") // ...
        }
    }

    override fun isolationMode() = IsolationMode.InstancePerTest

}

您也可以在ProjectConfig中更改它。如果你需要解释如何在那里做,检查ProjectConfig上的文档

另一种方法是清除afterTest方法上的模拟:

代码语言:javascript
复制
class MySpec : BehaviorSpec() {

    init {
        Given("XX") { 
            Then("YY") // ...
        }
    }

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

}

但我不知道在用例中这是怎么回事。

票数 6
EN

Stack Overflow用户

发布于 2019-12-23 08:26:02

  1. 您应该尝试各种clear方法来重置模拟的状态。有关更多信息,请查看这个相关的问题莫克氏文档
  2. 检查一下有关测试侦听器的文档。基本上,每个测试规范类都提供像beforeEach这样的生命周期方法,您可以重写这些方法来重置模拟(使用clear)。在扩展BehaviourSpec时,您应该能够重写这些方法,否则请确认如何为不同的测试风格执行此操作,以避免混淆。
票数 2
EN

Stack Overflow用户

发布于 2020-11-11 21:08:09

若要在每次测试后清除模拟,可以提供一个项目范围的侦听器:

代码语言:javascript
复制
import io.kotest.core.listeners.TestListener
import io.kotest.core.spec.AutoScan
import io.kotest.core.test.TestCase
import io.kotest.core.test.TestResult
import io.mockk.clearAllMocks

@AutoScan
class MockkClearingTestListener : TestListener {
    override suspend fun afterEach(testCase: TestCase, result: TestResult) = clearAllMocks()
}

例如,这适用于WordSpec中的每一个叶子,也应该适用于BehaviorSpec

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59442266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档