【问题标题】:How to mock a specific reading file?如何模拟特定的阅读文件?
【发布时间】:2020-06-22 12:46:31
【问题描述】:

我正在实现一个单元测试,它应该从特定路径读取文件并执行一些操作。

在真实场景中,我的文件将存在于操作系统的特定路径中 - 类似于 /users/placplac/file.txt

如何在单元测试中实现模拟(或从资源中读取文件)?

这是我要模拟的一段代码:

class ReportServiceImpl(val filePath: String) {

    private fun getContent() {
      val reader = Mybject(File(filePath).bufferedReader()) // this is what I want to mock
      ....
    }
}

是否可以只模拟 File(filePath).bufferedReader() 部分?

【问题讨论】:

    标签: java unit-testing kotlin mocking mockito


    【解决方案1】:

    只要路径不是硬编码并作为参数传递,您就可以使用测试资源的路径调用此函数(在src/test/resources中):

    val resource = this::class.java.classLoader.getResource("test.txt")
    val file = Paths.get(resource.toURI()).toFile()
    val absolutePath = file.getAbsolutePath()
    val subject = ReportServiceImpl(absolutePath)
    
    ... do your tests
    

    【讨论】:

    • 听起来不错,但会引发空指针异常。该文件在test文件夹下的resources
    • 玩弄路径。 NPE 很可能意味着您在getResource() 调用中使用了错误的路径,结果资源为空。在SO上搜索这个话题,有很多问答,比如this
    • 只是好奇为什么 this.javaClass.getResourceAsStream("/test.txt") 有效而 getResource() 无效 - 我尝试过使用 ./test.txttest.txt
    • 不看源码和调试真的很难猜。
    • 这就是我每次编写测试时的做法。我是否需要从斜线开始?我是否需要为类或其类加载器调用getResource。经过几次实验,我总能找到合适的组合。
    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多