Skip to content

Commit 0ac7e41

Browse files
committed
Provide an implementation of JsonComparator
See gh-32791
1 parent f62275d commit 0ac7e41

File tree

1 file changed

+34
-24
lines changed

1 file changed

+34
-24
lines changed

spring-test/src/main/java/org/springframework/test/json/JsonAssert.java

+34-24
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616

1717
package org.springframework.test.json;
1818

19+
import org.json.JSONException;
1920
import org.skyscreamer.jsonassert.JSONCompare;
2021
import org.skyscreamer.jsonassert.JSONCompareMode;
2122
import org.skyscreamer.jsonassert.JSONCompareResult;
23+
import org.skyscreamer.jsonassert.comparator.DefaultComparator;
2224
import org.skyscreamer.jsonassert.comparator.JSONComparator;
2325

2426
import org.springframework.lang.Nullable;
25-
import org.springframework.util.function.ThrowingBiFunction;
2627

2728
/**
2829
* Useful methods that can be used with {@code org.skyscreamer.jsonassert}.
@@ -40,7 +41,9 @@ public abstract class JsonAssert {
4041
* @see JSONCompareMode#LENIENT
4142
*/
4243
public static JsonComparator comparator(JsonCompareMode compareMode) {
43-
return comparator(toJSONCompareMode(compareMode));
44+
JSONCompareMode jsonAssertCompareMode = (compareMode != JsonCompareMode.LENIENT
45+
? JSONCompareMode.STRICT : JSONCompareMode.LENIENT);
46+
return comparator(jsonAssertCompareMode);
4447
}
4548

4649
/**
@@ -50,8 +53,7 @@ public static JsonComparator comparator(JsonCompareMode compareMode) {
5053
* @return a new {@link JsonComparator} instance
5154
*/
5255
public static JsonComparator comparator(JSONComparator comparator) {
53-
return comparator((expectedJson, actualJson) -> JSONCompare
54-
.compareJSON(expectedJson, actualJson, comparator));
56+
return new JsonAssertJsonComparator(comparator);
5557
}
5658

5759
/**
@@ -61,33 +63,41 @@ public static JsonComparator comparator(JSONComparator comparator) {
6163
* @return a new {@link JsonComparator} instance
6264
*/
6365
public static JsonComparator comparator(JSONCompareMode mode) {
64-
return comparator((expectedJson, actualJson) -> JSONCompare
65-
.compareJSON(expectedJson, actualJson, mode));
66+
return new JsonAssertJsonComparator(mode);
6667
}
6768

68-
private static JsonComparator comparator(ThrowingBiFunction<String, String, JSONCompareResult> compareFunction) {
69-
return (expectedJson, actualJson) -> compare(expectedJson, actualJson, compareFunction);
70-
}
69+
private static class JsonAssertJsonComparator implements JsonComparator {
7170

72-
private static JsonComparison compare(@Nullable String expectedJson, @Nullable String actualJson,
73-
ThrowingBiFunction<String, String, JSONCompareResult> compareFunction) {
71+
private final JSONComparator jsonAssertComparator;
7472

75-
if (actualJson == null) {
76-
return (expectedJson != null)
77-
? JsonComparison.mismatch("Expected null JSON")
78-
: JsonComparison.match();
73+
JsonAssertJsonComparator(JSONComparator jsonAssertComparator) {
74+
this.jsonAssertComparator = jsonAssertComparator;
7975
}
80-
if (expectedJson == null) {
81-
return JsonComparison.mismatch("Expected non-null JSON");
76+
77+
JsonAssertJsonComparator(JSONCompareMode compareMode) {
78+
this(new DefaultComparator(compareMode));
8279
}
83-
JSONCompareResult result = compareFunction.throwing(IllegalStateException::new).apply(expectedJson, actualJson);
84-
return (!result.passed())
85-
? JsonComparison.mismatch(result.getMessage())
86-
: JsonComparison.match();
87-
}
8880

89-
private static JSONCompareMode toJSONCompareMode(JsonCompareMode compareMode) {
90-
return (compareMode != JsonCompareMode.LENIENT ? JSONCompareMode.STRICT : JSONCompareMode.LENIENT);
81+
@Override
82+
public JsonComparison compare(@Nullable String expectedJson, @Nullable String actualJson) {
83+
if (actualJson == null) {
84+
return (expectedJson != null)
85+
? JsonComparison.mismatch("Expected null JSON")
86+
: JsonComparison.match();
87+
}
88+
if (expectedJson == null) {
89+
return JsonComparison.mismatch("Expected non-null JSON");
90+
}
91+
try {
92+
JSONCompareResult result = JSONCompare.compareJSON(expectedJson, actualJson, this.jsonAssertComparator);
93+
return (!result.passed())
94+
? JsonComparison.mismatch(result.getMessage())
95+
: JsonComparison.match();
96+
}
97+
catch (JSONException ex) {
98+
throw new IllegalStateException(ex);
99+
}
100+
}
91101
}
92102

93103
}

0 commit comments

Comments
 (0)