JUnit テストで生成されるJSON を期待値 JSONテキストと比較して検証したい。
hamcrest-json というのを使うとできる。
Hamcrest Related Projects
ここから、
GitHub - hertzsprung/hamcrest-json: Hamcrest matchers for comparing JSON documents
を辿ると見つかる。
現在、Maven セントラルリポジトリにあるバージョンは、0.2 であった。
<dependency> <groupId>uk.co.datumedge</groupId> <artifactId>hamcrest-json</artifactId> <version>0.2</version> <scope>test</scope </dependency>
使用サンプル
@Test public void test() { // TODO テスト実行 try{ // 期待値JSON読込み String expectJson = Files.readString( Path.of(Thread.currentThread().getContextClassLoader() .getResource("excpect.json").toURI()) , StandardCharsets.UTF_8); //String actualJson = テストで取得する結果 JSON テキスト // 検証 MatcherAssert.assertThat(actualJson, SameJSONAs.sameJSONAs(expectJson)); }catch(IOException e){ e.printStackTrace(); Assert.fail(); }catch(URISyntaxException e){ e.printStackTrace(); Assert.fail(); } }
キーが多い時
expectJson より、actualJson で、追加キーが存在する場合は、、
MatcherAssert.assertThat(actualJson, SameJSONAs.sameJSONAs(expectJson).allowingExtraUnexpectedFields());
配列の順番を問わない
expectJson と、actualJson で、中の配列の値が変わらず順番を問わない場合は、、
MatcherAssert.assertThat(actualJson, SameJSONAs.sameJSONAs(expectJson).allowingAnyArrayOrdering());
キーが多い時 AND 配列の順番を問わない
allowingExtraUnexpectedFields() と、allowingAnyArrayOrdering() を連結で良い
MatcherAssert.assertThat(actualJson, SameJSONAs.sameJSONAs(expectJson).allowingExtraUnexpectedFields().allowingAnyArrayOrdering());