hamcrest-json のチェック処理メソッドを使いやすくする

hamcrest-json を JUnit 以外で使用する - Oboe吹きプログラマの黙示録
と、書いたがもっと実践的なものにする。

Maven pom.xml に追加する

<dependency>
   <groupId>uk.co.datumedge</groupId>
   <artifactId>hamcrest-json</artifactId>
   <version>0.2</version>
</dependency>

AssertionError を捕まえてエラーメッセージを、ラムダ(Consumer)で処理する。
インターフェースでメソッドを提供

import java.util.function.Consumer;
import org.hamcrest.MatcherAssert;
import uk.co.datumedge.hamcrest.json.SameJSONAs;
/**
 * JsonCompare
 */
public interface JsonCompare{
    default boolean sameJson(String realJson, String expectJson, Consumer<String> diff){
        try{
            MatcherAssert.assertThat(realJson, SameJSONAs.sameJSONAs(expectJson));
            return true;
        }catch(AssertionError e){
            diff.accept(e.getMessage()
                    .replaceAll("\\\\r", "")
                    .replaceAll("\\\\n", "\n")
                    .replaceAll("\\\\\"", "\"")
            );
            return false;
        }
    }
    // realJson > expectJson でもOK
    default boolean sameJsonAnyKey(String realJson, String expectJson, Consumer<String> diff){
        try{
            MatcherAssert.assertThat(realJson, SameJSONAs.sameJSONAs(expectJson).allowingExtraUnexpectedFields());
            return true;
        }catch(AssertionError e){
            diff.accept(e.getMessage()
                    .replaceAll("\\\\r", "")
                    .replaceAll("\\\\n", "\n")
                    .replaceAll("\\\\\"", "\"")
            );
            return false;
        }
    }
    // 配列並びが異なってもOK
    default boolean sameJsonAnyOrder(String realJson, String expectJson, Consumer<String> diff){
        try{
            MatcherAssert.assertThat(realJson, SameJSONAs.sameJSONAs(expectJson).allowingAnyArrayOrdering());
            return true;
        }catch(AssertionError e){
            diff.accept(e.getMessage()
                    .replaceAll("\\\\r", "")
                    .replaceAll("\\\\n", "\n")
                    .replaceAll("\\\\\"", "\"")
            );
            return false;
        }
    }
    // ealJson > expectJson でもOK AND  配列並びが異なってもOK
    default boolean sameJsonAnyKeyOrder(String realJson, String expectJson, Consumer<String> diff){
        try{
            MatcherAssert.assertThat(realJson, SameJSONAs.sameJSONAs(expectJson)
                    .allowingExtraUnexpectedFields().allowingAnyArrayOrdering());
            return true;
        }catch(AssertionError e){
            diff.accept(e.getMessage()
                    .replaceAll("\\\\r", "")
                    .replaceAll("\\\\n", "\n")
                    .replaceAll("\\\\\"", "\"")
            );
            return false;
        }
    }
}

使い方

boolean res = sameJson(realJson, expectJson, diffstr->{
    // diffstr は、JSONの違いを説明を記述した String 
    
});

JSON に違いがあった時だけ、Consumer diffstr ->{ } が実行される