我最近使用过Kotest,我没有遇到任何问题,但是最近我尝试了一些依赖注入的注释,所以为了简化问题,我创建了一些基本类,其中一些方法只是打印一些消息,只是为了学习如何使用Kotest和Mockk,但是在测试期间,我运行了一个例外,就是在尝试运行测试时没有初始化变量。
这是我的课
class DefaultClass : AbstractClass() {
private val anotherClass: AnotherClass = AnotherClass()
fun testMethod(value: String): String {
val normalizeValue = value.trim().lowercase().replace(Regex("[^ A-Za-z\\d]*"), "")
return runBlocking {
anotherClass.someOtherMethod()
callsProtectedMethod(normalizeValue)
}
}
private suspend fun callsProtectedMethod(value: String) = coroutineScope {
println("Original method")
returnDefaultString(value)
}
}AnotherClass
class AnotherClass {
fun someOtherMethod(): Unit {
println("SomeOtherMethod original")
}
}测试
class DefaultClassTest : FunSpec({
context("Testing DefaultClass") {
@MockK
lateinit var anotherClass: AnotherClass
@OverrideMockKs
lateinit var defaultClass: DefaultClass
beforeContainer {
MockKAnnotations.init(this)
}
test("testing mocks") {
defaultClass.testMethod("some method")
}
}我已经将初始化更改为beforeTest,将其从上下文中删除,还使用了beforeContainer、beforeTest、beforeSpec,但这些工作都没有.每次我还能得到lateinit property defaultClass has not been initialized
因此,我使用JUnit重新创建了相同的测试,并且没有这个问题。
class DefaultClassJUnitTest {
companion object {
@MockK
lateinit var anotherClass: AnotherClass
@OverrideMockKs
lateinit var defaultClass: DefaultClass
@BeforeAll
@JvmStatic
fun setup() {
MockKAnnotations.init(this)
}
}
@Test
fun `Testing with JUnit`() {
every { anotherClass.someOtherMethod() } answers {
println("Mocking another class")
}
val value = defaultClass.testMethod("some method")
}
}所以我很确定我在使用Kotest时做错了什么。我希望有人能帮我谢谢..。
发布于 2022-10-24 07:27:04
我认为MockK可能并不是在寻找函数作用域中定义的变量。如果要使用注释,很可能必须将它们移动到伴生对象,如下所示:
class DefaultClassTest : FunSpec({
context("Testing DefaultClass") {
beforeContainer {
MockKAnnotations.init(this)
}
test("testing mocks") {
defaultClass.testMethod("some method")
}
}
}) {
companion object {
@MockK
lateinit var anotherClass: AnotherClass
@OverrideMockKs
lateinit var defaultClass: DefaultClass
}
}https://stackoverflow.com/questions/74160310
复制相似问题