[英]How to verify a mock interface in a test method using KotlinTest library?
[英]Kotlintest with Mockk How to clear verify count
所以我有以下代码:
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 方法。
这可能是因为 KotlinTest 与 JUnit 在被视为测试的内容以及创建Spec
实例时不同。
KotlinTest
的默认行为是在每次执行时创建Spec
的单个实例。 因此,您的模拟不会在执行之间重置,因为您可能在class level
创建了它们。
要解决此问题,您可以做的是在测试中进行mockk
,或者将隔离模式更改为每次执行测试时都创建Spec
模式。
默认的isolationMode
是IsolationMode.SingleInstance
。 您可以通过覆盖isolationMode
功能在Spec
本身上更改它:
class MySpec : BehaviorSpec() {
init {
Given("XX") {
Then("YY") // ...
}
}
override fun isolationMode() = IsolationMode.InstancePerTest
}
您也可以在 ProjectConfig 中更改它。 如果您需要有关如何在那里执行此操作的说明, 请查看 ProjectConfig 上的文档
另一种方法是清除afterTest
方法上的afterTest
:
class MySpec : BehaviorSpec() {
init {
Given("XX") {
Then("YY") // ...
}
}
override fun afterTest(testCase: TestCase, result: TestResult) {
clearAllMocks()
}
}
但我不确定这在您的用例中如何工作。
要在每次测试后清除模拟,您可以提供一个项目范围的侦听器:
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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.