Unit testing 如何使用mockk.io模拟内部构造的实例?
我正在用Mock和Junit5为FileUtility类的伴生对象中定义的静态方法编写单元测试用例 方法如下:Unit testing 如何使用mockk.io模拟内部构造的实例?,unit-testing,kotlin,junit5,mockk,mockito-kotlin,Unit Testing,Kotlin,Junit5,Mockk,Mockito Kotlin,我正在用Mock和Junit5为FileUtility类的伴生对象中定义的静态方法编写单元测试用例 方法如下: class FileUtility { companion object { fun getFileObject(fileName: String): File { require(!StringUtils.isBlank(fileName)) { "Expecting a valid filePath" } v
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}
}
单元测试用例如下所示:
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}
}
另外,verify{file.ishiden}行没有工作,它给出了以下错误
java.lang.AssertionError: Verification failed: call 1 of 1: File(#1).isHidden()) was not called
您正在测试的函数实例化其自己的文件实例。它没有使用您创建的模拟实例 对于这种类型的测试,您需要模拟构造函数,以便模拟类的任何实例化实例。您可以在此处阅读更多内容,但以下是使用不同断言库的示例:
@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}
}
您正在测试的函数实例化其自己的文件实例。它没有使用您创建的模拟实例 对于这种类型的测试,您需要模拟构造函数,以便模拟类的任何实例化实例。您可以在此处阅读更多内容,但以下是使用不同断言库的示例:
@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.StackOverflowerError错误中出现的异常。@AkashPatel-这是使用mockk执行您想要执行的操作的方式。但是,他们似乎有一个开放的bug票据->一些类似乎遇到了堆栈溢出。。。。不幸的我认为,在他们修复该错误之前,您可能会将自己的发现添加到该问题中。您可能会使用类似于power mock的方法来模拟构造函数。您面临的StackOverflower错误可能与此已知问题有关:这是线程“main”java.lang.StackOverflower错误中出现的异常。@AkashPatel-这是就是你如何使用mockk来做你想做的事情。但是,他们似乎有一个开放的bug票据->一些类似乎遇到了堆栈溢出。。。。不幸的我认为,在他们修复错误之前,您可能会将自己的发现添加到该问题中。您可能会使用类似power mock的方法来模拟构造函数。您面临的StackOverflower错误可能与此已知问题有关: