2

我正在为 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
4

1 回答 1

5

您正在测试的函数实例化了它自己的 a 实例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}
}
于 2020-05-17T14:30:01.830 回答