hamcrest-json を JUnit 以外で使用する - Oboe吹きプログラマの黙示録
と、書いたがもっと実践的なものにする。
<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 ->{ } が実行される