首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mockk @OverrideMockK不与Kotest合作

Mockk @OverrideMockK不与Kotest合作
EN

Stack Overflow用户
提问于 2022-10-22 00:33:20
回答 1查看 33关注 0票数 0

我最近使用过Kotest,我没有遇到任何问题,但是最近我尝试了一些依赖注入的注释,所以为了简化问题,我创建了一些基本类,其中一些方法只是打印一些消息,只是为了学习如何使用Kotest和Mockk,但是在测试期间,我运行了一个例外,就是在尝试运行测试时没有初始化变量。

这是我的课

代码语言:javascript
复制
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

代码语言:javascript
复制
class AnotherClass {

    fun someOtherMethod(): Unit {
        println("SomeOtherMethod original")
    }
}

测试

代码语言:javascript
复制
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重新创建了相同的测试,并且没有这个问题。

代码语言:javascript
复制
    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时做错了什么。我希望有人能帮我谢谢..。

EN

回答 1

Stack Overflow用户

发布于 2022-10-24 07:27:04

我认为MockK可能并不是在寻找函数作用域中定义的变量。如果要使用注释,很可能必须将它们移动到伴生对象,如下所示:

代码语言:javascript
复制
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
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74160310

复制
相关文章

相似问题

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