注: 私は Kotlin / JUnit エコシステムにまったく慣れていないので、質問に基本的なものが欠けている場合はご容赦ください。
JSON ベースのファイル形式に取り組んでいます。ユニット/統合テストでは、シリアライゼーションによって参照 JSON ツリーとまったく同じ JSON ツリーが生成されることを確認したいと思います。特に、シリアライゼーションが暗黙的または明示的な null などの微妙な点を正しく処理することを確認したいと思います。
予想される JSON をプレーン.json
ファイルの形式でテスト リソースとして追加したので、予想される JSON の文字列コンテンツを読み込めるようになりました。私の問題は、かなり深い/複雑なJSONツリーを必要とするテストケースがあり、比較が失敗した場合に意味のあるテスト出力を取得する良い方法が見つからないことです. たとえば、JSON ツリーのどこかで 1 つの値だけが間違っている場合を考えてみましょう。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)
が、残念ながら 2 つの文字列を出力するだけで、2 つの文字列が等しくないと言って、どこが違うのかについてのヒントがありません。
kotlinx または JUnit に、解釈しやすいテストの失敗出力を生成できる機能はありますか?
重要な場合: 私は JUnit 5 を使用していますが、代替手段を受け入れています。