【问题标题】:JUnit testing for reading JSON files用于读取 JSON 文件的 JUnit 测试
【发布时间】:2014-10-06 01:43:39
【问题描述】:

假设我想为 Java 类编写一个测试,该类将提供一种读取和解析外部文件的方法(准确地说,文件是 JSON,我将使用 Jackson)。

此外,我有一些我要解析的 JSON 文件的示例,而且我也不清楚这个 SomeMagicalReader.readPony("path/to/location/pony.json") 方法应该返回什么样的 Java 对象;如果我设法让readPony 返回某种PonyObject,我想知道如何测试生成的PonyObject 是我所期望的。

我的问题是为readPony 函数提供测试数据。我可能想太多了,但是(1)有一种惯用的“Java + Junit”方式吗? (= 测试读取外部文件的方法?)将示例文件的内容复制粘贴为测试代码中的字符串变量? (它们相当短,但最终还是会很快看起来很难看。)将示例 JSON 放在 ...somewhere 并使用路径调用 readPony? (这听起来更明智。)(2)如果我的测试以 Maven 风格的测试包层次结构组织,那么放置此类外部 JSON 测试文件的规范位置将是什么,例如src/test/java/com/stuff/app/package/SomeMagicalReaderTest.java?

【问题讨论】:

    标签: java json maven file-io junit


    【解决方案1】:

    您应该问自己项目的关键任务代码是什么 - 读取文件或解析其内容。对于我的项目,解析是有趣的部分,所以我将要解析的文件作为测试资源放置,在单元测试中将它们读取为字符串并将它们传递给解析器以对解析器进行单元测试。也可以将内容直接包含在单元测试中作为大而丑陋的字符串,但是当您有专门的测试资源位置时,为什么不使用它。

    【讨论】:

    • 当然,传递文件的字符串表示是丑陋的。从测试路径创建新的File 对象更简洁。
    【解决方案2】:

    根据 maven 的 standard directory layout,我建议您将 JSON 测试文件放在 src/test/resources 中,因为它们测试资源。请注意,您可以(并且应该)在资源文件夹下组织自己的文件夹层次结构(其他开发人员会发现在修复或添加其他一些测试时更容易找到特定的测试资源)。

    所以是的,如果您自己的测试资源层次结构足够好(例如,如果您认为您的包结构用有意义的包名称组织得很好,在你的测试资源层次结构中遵循它根本不是一个坏主意)。

    【讨论】:

    • 所以听起来您是在提倡 OP 将文件复制到 resources 目录并直接测试这些文件的方法,而不是测试将在生产中的真实文件?我自己在 Junit 中也面临着同样的困境,并暗示这是白盒测试最谨慎的方法......
    • 将这些生产文件复制到您的src/test/resources 文件夹层次结构中有什么问题?围绕生产数据而不是“虚拟”数据构建的测试是最好的测试。
    • 没有错。我说我认为这是谨慎的做法。只是想澄清一下。
    【解决方案3】:

    将示例文件的内容复制粘贴为测试代码中的字符串变量

    我建议不要这样做,因为它会使修改测试的输入变得更加困难。此外,使用外部文件使您的测试更加灵活。例如,读取外部文件允许您创建多个测试,同时为每个测试重用基本框架。当然,这也意味着您需要花一些时间来设计实际执行测试的方法。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多