【问题标题】:How to mock internally constructed instance with mockk.io?如何使用 mockk.io 模拟内部构造的实例?
【发布时间】:2020-09-03 06:45:19
【问题描述】:

我正在为 FileUtility 类的伴随对象中定义的静态方法在 mockk 和 Junit5 中编写单元测试用例。

方法如下,

class FileUtility {

    companion object {
        fun getFileObject(fileName: String): File {
            require(!StringUtils.isBlank(fileName)) { "Expecting a valid filePath" }
            val file = File(fileName)
            if (file.isHidden)
                throw llegalArgumentException()
            return file
        }
    }

}

单元测试用例如下,

@Test
fun `get file object test throws exception when file path is hidden`() {
    val filePath = "filepath"
    val file = mockk<File>()
    every { file.isHidden } returns true
    assertThrows(IllegalArgumentException::class.java) {
        getFileObject(filePath)
    }
    verify { file.isHidden}
}

得到以下错误,

Expected java.lang.Exception to be thrown, but nothing was thrown.

另外,verify { file.isHidden} 行不工作,它给出以下错误。

java.lang.AssertionError: Verification failed: call 1 of 1: File(#1).isHidden()) was not called

【问题讨论】:

    标签: unit-testing kotlin junit5 mockk mockito-kotlin


    【解决方案1】:

    您正在测试的函数实例化了它自己的File 实例。它没有使用您创建的模拟实例。

    对于这种类型的测试,您需要模拟构造函数,以便模拟类的任何实例化实例。您可以在这里阅读更多内容https://mockk.io/#constructor-mocks,但这是您的示例(使用不同的断言库):

    @Test
    fun `get file object test throws exception when file path is hidden`() {
        val filePath = "filepath"
        mockkConstructor(File::class)
        every { anyConstructed<File>().isHidden } returns true
        assertThat{
            getFileObject(filePath)
        }.isFailure().isInstanceOf(IllegalArgumentException::class)
        verify { anyConstructed<File>().isHidden}
    }
    

    【讨论】:

    • 这给出了“线程 'main' java.lang.StackOverflowError 中的异常”错误。
    • @AkashPatel - 这就是你如何使用 mockk 来做你想做的事。但是,似乎他们有一个开放的错误票 -> github.com/mockk/mockk/issues/205 有些类似乎遇到了这个堆栈溢出......不幸的是。我认为在他们修复错误之前(您也可以将自己的发现添加到该问题中),您可能会坚持使用类似 power mock 之类的东西来模拟您的构造函数。
    • 您面临的“StackOverflowError”可能与这个已知问题有关:github.com/mockk/mockk/issues/121
    猜你喜欢
    • 2021-12-24
    • 2018-11-24
    • 2022-10-17
    • 1970-01-01
    • 2011-03-17
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多