如何在单元测试中验证Kotlin代码file.delete()执行情况(无法Mock FileCreator)
如何验证
file.delete()是否执行(无法Mock FileCreator的场景) 由于无法Mock FileCreator,它会生成真实文件,我们可以通过追踪文件系统状态或自定义测试实现两种方式来验证删除操作是否执行:
方案1:通过实际文件系统状态验证
如果FileCreator创建的文件路径可预测(或可配置),直接检查文件是否被删除:
import org.junit.jupiter.api.Test import org.junit.jupiter.api.io.TempDir import java.io.File import kotlin.test.assertFalse class ClassATest { // 自动生成临时目录,测试结束后自动清理 @TempDir lateinit var tempDir: File @Test fun `doA should delete the created file in finally block`() { // 初始化FileCreator,指定临时目录作为文件创建路径(需根据实际构造逻辑调整) val fileCreator = FileCreator(tempDir) val classA = ClassA(fileCreator) // 调用目标方法 classA.doA() // 定位FileCreator创建的文件(假设文件名固定为"output.txt") val targetFile = File(tempDir, "output.txt") // 验证文件不存在,证明delete()已执行 assertFalse(targetFile.exists(), "Created file should be deleted after doA execution") } }
方案2:自定义可追踪的FileCreator实现
如果FileCreator是接口/抽象类,可编写测试专用子类,直接追踪delete()调用状态:
首先确保FileCreator是接口(如果原代码不是,建议重构为接口以提升可测试性):
interface FileCreator { fun create(): File }
编写测试用的追踪实现:
class TrackableFileCreator(private val tempDir: File) : FileCreator { var isDeleteCalled = false lateinit var createdFile: File override fun create(): File { createdFile = File(tempDir, "tracked-file.txt").apply { createNewFile() } // 重写delete方法,记录调用状态 return object : File(createdFile.path) { override fun delete(): Boolean { isDeleteCalled = true return super.delete() } } } }
编写测试用例:
import org.junit.jupiter.api.Test import org.junit.jupiter.api.io.TempDir import kotlin.test.assertTrue class ClassATest { @TempDir lateinit var tempDir: File @Test fun `doA triggers file delete operation`() { val trackableCreator = TrackableFileCreator(tempDir) val classA = ClassA(trackableCreator) classA.doA() // 直接验证delete()是否被调用 assertTrue(trackableCreator.isDeleteCalled, "File delete method should be executed") } }
额外测试场景
别忘了覆盖异常分支:当fileCreator.create()抛出IOException时,file为null,此时delete()不会执行,需单独测试验证文件未被创建/删除。
内容的提问来源于stack exchange,提问作者figaro
相关产品推荐
相关产品推荐

