我最近使用了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)
}
}
另一类
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时做错了什么。我希望有人能帮助我,谢谢。。。
我认为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
}
}