注意:我对 Kotlin / JUnit 生态系统完全陌生,所以如果问题缺少基本内容,请多多包涵。
我正在研究基于 JSON 的文件格式。在单元/集成测试中,我想检查序列化是否生成与某些参考 JSON 树完全相同的 JSON 树。特别是我想确保序列化正确处理隐式或显式空值等微妙之处。
我已经以纯文件的形式添加了预期的 JSON.json
作为测试资源,因此我现在可以加载预期 JSON 的字符串内容。我的问题是我的测试用例需要一些相当深/复杂的 JSON 树,如果比较失败,我找不到获得有意义的测试输出的好方法。例如,考虑 JSON 树深处某处只有一个值错误的情况。在 Rust 中,我使用例如rust-pretty-assertions 来解决这些问题:
我已经尝试过这些方法:
基于 的比较
JsonElement
。我基本上使用:val actualContent: String = ... # from serialization val expectedContent: String = ... # from test fixture val actual = Json.parseToJsonElement(actualContent) val expected = Json.parseToJsonElement(expectedContent) Assertions.assertEquals(actual, expected)
不幸的是,如果比较失败,测试输出只包含一行
org.opentest4j.AssertionFailedError: expected: <{ ... long unformatted JSON ...}>
,这使得很难发现断言失败的实际原因。当然这种行为是有道理的,因为如果JsonElement.equals
返回 false,JUnit 只能打印它。直接字符串比较:这当然不是完美的,因为 JSON 树可以相同,即使它们的字符串表示不同。但是我希望对它们进行漂亮的序列化可以让我在 JUnit 中使用某种字符串差异功能。到目前为止,我使用的是 JUnit 的 plain
Assertions.assertEquals(actual, expected)
,不幸的是它只打印了两个字符串,说它们不相等,没有提示它们的不同之处。
kotlinx 或 JUnit 中是否有可以产生易于解释的测试失败输出的功能?
以防万一:我正在使用 JUnit 5,但我愿意接受替代方案。