Skip to content

Commit 0af9d6a

Browse files
authored
Merge pull request #13 from codeleep/dev_4.x
修复测试用例&bug修复
2 parents 676d536 + 8164dfe commit 0af9d6a

File tree

11 files changed

+1099
-853
lines changed

11 files changed

+1099
-853
lines changed

Readme.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,12 +102,12 @@ public class UseExample {
102102

103103
### 2.配置
104104

105-
| 配置 | 类型 | 备注 |
106-
| ---------------- | ------------------------------ | ------------------------------------------------------------ |
107-
| ignoreOrder | boolean | 是否比较过程中忽略数组顺序 |
108-
| mapping | Map<String, String> | 将真实字段映射到期望字段,key是真实字段name,value是期望的字段name |
109-
| ignorePath | Set\<String\> | 当对比的路径完全匹配时会被跳过。遇到数组使用 `[]` 即可。无需填入下标 |
110-
| ignoreKey | Set\<String\> | 对比object时。或忽略该key。对整个json生效 |
105+
| 配置 | 类型 | 备注 |
106+
| ---------------- | ------------------------------ |------------------------------------------------------------------------|
107+
| ignoreOrder | boolean | 是否比较过程中忽略数组顺序 |
108+
| mapping | Map<String, String> | 将真实字段映射到期望字段,key是真实字段name,value是期望的字段name.当真实字段和期望的字段对应的key都存在时,该配置才生效 |
109+
| ignorePath | Set\<String\> | 当对比的路径完全匹配时会被跳过。标准的json-path |
110+
| ignoreKey | Set\<String\> | 对比object时。或忽略该key。对整个json生效 |
111111

112112
> `2.0.1-RC1-RELEASE` 之后版本中移除了 `keyFunction` 配置参数。可以使用 `ignorePath` 来代替达到同样的效果。
113113

json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/array/ComplexArrayJsonNeat.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ protected JsonCompareResult ignoreOrder(JsonDiffArray expect, JsonDiffArray actu
3939
continue;
4040
}
4141
TravelPath nextTravelPath = new TravelPath(this.travelPath, expectIndex, actualIndex);
42-
JsonNeat<? extends JsonDiff> jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate( expect.get(expectIndex), actual.get(actualIndex), nextTravelPath);
42+
JsonNeat<? extends JsonDiff> jsonNeat = RunTimeDataFactory.getOptionInstance().getJsonNeatFactory().generate(expect.get(expectIndex), actual.get(actualIndex), nextTravelPath);
4343
if (jsonNeat == null) {
4444
continue;
4545
}

json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/object/ComplexObjectJsonNeat.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,21 @@ private void keySetConversion(Set<String> expectKeys, Set<String> actualKeys) {
7777
// 移除忽略的Path
7878
HashSet<String> ignorePath = RunTimeDataFactory.getOptionInstance().getIgnorePath();
7979
List<MappingKey> mappingKeys = keyMap.stream().filter(mappingKey -> {
80-
String actualTravelPath = PathUtil.getObjectPath(travelPath.getActualTravelPath()) + mappingKey.getActualKey();
81-
String expectTravelPath = PathUtil.getObjectPath(travelPath.getExpectTravelPath()) + mappingKey.getExpectKey();
82-
if (ignorePath.contains(actualTravelPath) || ignorePath.contains(expectTravelPath) ) {
83-
return false;
80+
String actualKey = mappingKey.getActualKey();
81+
if (actualKey != null) {
82+
String actualTravelPath = PathUtil.getObjectPath(travelPath.getActualTravelPath()) + mappingKey.getActualKey();
83+
String abstractActualTravelPath = PathUtil.getObjectPath(travelPath.getAbstractTravelPath()) + mappingKey.getActualKey();
84+
if (ignorePath.contains(actualTravelPath) || ignorePath.contains(abstractActualTravelPath)) {
85+
return false;
86+
}
87+
}
88+
String expectKey = mappingKey.getExpectKey();
89+
if (expectKey != null) {
90+
String expectTravelPath = PathUtil.getObjectPath(travelPath.getExpectTravelPath()) + mappingKey.getExpectKey();
91+
String abstractExpectTravelPath = PathUtil.getObjectPath(travelPath.getAbstractTravelPath()) + mappingKey.getExpectKey();
92+
if (ignorePath.contains(expectTravelPath) || ignorePath.contains(abstractExpectTravelPath)) {
93+
return false;
94+
}
8495
}
8596
return true;
8697
}).collect(Collectors.toList());

json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/other/ComplexOtherJsonNeat.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ protected JsonCompareResult diff1() {
3535
result.addDefects(defects);
3636
return result;
3737
}
38+
if (!ClassUtil.isSameClass(expect.getOther(), actual.getOther())) {
39+
Defects defects = new Defects()
40+
.setActual(actual)
41+
.setExpect(expect)
42+
.setTravelPath(travelPath)
43+
.setIllustrateTemplate(DATA_TYPE_INCONSISTENT, ClassUtil.getClassName(expect.getOther()), ClassUtil.getClassName(actual.getOther()));
44+
result.addDefects(defects);
45+
return result;
46+
}
3847
if (expect.isEquals(actual)) {
3948
return result;
4049
}

json-diff-core/src/main/java/me/codeleep/jsondiff/core/handle/primitive/ComplexPrimitiveJsonNeat.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ protected JsonCompareResult diff1() {
3535
result.addDefects(defects);
3636
return result;
3737
}
38+
if (!ClassUtil.isSameClass(expect.getTarget(), actual.getTarget())) {
39+
Defects defects = new Defects()
40+
.setActual(actual)
41+
.setExpect(expect)
42+
.setTravelPath(travelPath)
43+
.setIllustrateTemplate(DATA_TYPE_INCONSISTENT, ClassUtil.getClassName(expect.getTarget()), ClassUtil.getClassName(actual.getTarget()));
44+
result.addDefects(defects);
45+
return result;
46+
}
3847
if (expect.isEquals(actual)) {
3948
return result;
4049
}
Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package me.codeleep.jsondiff.core.utils;
22

3-
import me.codeleep.jsondiff.common.exception.JsonDiffException;
4-
import me.codeleep.jsondiff.common.model.neat.JsonDiffArray;
5-
import me.codeleep.jsondiff.common.model.neat.JsonDiffObject;
6-
73
import static me.codeleep.jsondiff.common.model.Constant.NULL;
84

95
/**
@@ -26,33 +22,6 @@ public static boolean isSameClass(Object obj1, Object obj2) {
2622
return obj1 == null && obj2 == null;
2723
}
2824

29-
/**
30-
* 判断当前对象是否为json数据格式中的基本类型
31-
* @param obj 判断的对象
32-
* @return 是否为基本类型
33-
*/
34-
public static boolean isPrimitiveType(Object obj){
35-
if(obj == null){
36-
return true;
37-
}
38-
39-
if(obj instanceof JsonDiffArray || obj instanceof JsonDiffObject){
40-
return false;
41-
}
42-
43-
if (String.class.isAssignableFrom(obj.getClass())) {
44-
return true;
45-
}
46-
if (obj instanceof Number) {
47-
return true;
48-
}
49-
try {
50-
return ((Class<?>)obj.getClass().getField("TYPE").get(null)).isPrimitive();
51-
} catch (Exception e) {
52-
return false;
53-
}
54-
}
55-
5625

5726
/**
5827
* 获取className
@@ -65,12 +34,4 @@ public static String getClassName(Object obj) {
6534
}
6635
return obj.getClass().getName();
6736
}
68-
69-
public static <T> T getClassNameInstance(Class<T> clazz) {
70-
try {
71-
return clazz.newInstance();
72-
} catch (Exception e) {
73-
throw new JsonDiffException(String.format("无法实例化: %s", clazz), e);
74-
}
75-
}
7637
}

json-diff-test/src/main/java/me/codeleep/jsondiff/test/MultAllArrayTest.java

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,65 +5,68 @@
55
import me.codeleep.jsondiff.common.model.JsonCompareResult;
66
import me.codeleep.jsondiff.test.model.MetaData;
77
import me.codeleep.jsondiff.test.dataFactory.ArrayDataFactory;
8+
import me.codeleep.jsondiff.test.utils.FormatContent;
89
import org.slf4j.Logger;
910
import org.slf4j.LoggerFactory;
1011
import org.testng.Assert;
1112
import org.testng.annotations.Test;
13+
1214
/**
1315
* @author: chenfeng
1416
* @createTime: 2023/3/2 21:55
1517
* @description: 数组类型的测试类
1618
*/
1719
public class MultAllArrayTest {
18-
private static final Logger logger = LoggerFactory.getLogger(MultAllArrayTest.class);
20+
private static final Logger logger = LoggerFactory.getLogger(MultAllArrayTest.class);
21+
private final DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
22+
1923
@Test(dataProvider = "right", dataProviderClass = ArrayDataFactory.class)
2024
public void noOptionRightTest(MetaData metaData) {
21-
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
2225
logger.info(metaData.getCaseName());
23-
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString());
26+
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString());
2427
JsonCompareResult jsonCompareResult = defaultJsonDifference
25-
.detectDiff(JSON.toJSONString(metaData.getExpect()) , JSON.toJSONString(metaData.getActual()));
26-
if (metaData.getRet() != null)
27-
{ Assert.assertEquals( JSON.toJSONString(jsonCompareResult),JSON.toJSONString(metaData.getRet()));}
28-
else
29-
{ Assert.assertEquals( JSON.toJSONString(jsonCompareResult),"{\"match\":true}");}
28+
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
29+
if (metaData.getRet() != null) {
30+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
31+
} else {
32+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent("{\"match\":true}"));
33+
}
3034
}
3135

3236
@Test(dataProvider = "err", dataProviderClass = ArrayDataFactory.class)
3337
public void noOptionErrTest(MetaData metaData) {
34-
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
3538
logger.info(metaData.getCaseName());
36-
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString()+"\n"+metaData.getOption());
39+
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString() + "\n" + metaData.getOption());
3740
JsonCompareResult jsonCompareResult = defaultJsonDifference
38-
.detectDiff(JSON.toJSONString(metaData.getExpect()) , JSON.toJSONString(metaData.getActual()));
39-
Assert.assertEquals(JSON.toJSONString(jsonCompareResult),JSON.toJSONString(metaData.getRet()));
40-
41+
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
42+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
4143
}
4244

4345
@Test(dataProvider = "optionRight", dataProviderClass = ArrayDataFactory.class)
4446
public void optionRight(MetaData metaData) {
45-
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
4647
logger.info(metaData.getCaseName());
47-
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString()+"\n");
48+
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString() + "\n");
4849
JsonCompareResult jsonCompareResult = defaultJsonDifference
4950
.option(metaData.getOption())
50-
.detectDiff(JSON.toJSONString(metaData.getExpect()) , JSON.toJSONString(metaData.getActual()));
51+
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
5152
if (metaData.getRet() != null) {
52-
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), JSON.toJSONString(metaData.getRet()));
53-
}
54-
else {
55-
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), "{\"match\":true}");
53+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
54+
} else {
55+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent("{\"match\":true}"));
5656
}
5757
}
5858

5959
@Test(dataProvider = "optionErr", dataProviderClass = ArrayDataFactory.class)
6060
public void optionErr(MetaData metaData) {
61-
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
6261
logger.info(metaData.getCaseName());
63-
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString()+"\n");
62+
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString() + "\n");
6463
JsonCompareResult jsonCompareResult = defaultJsonDifference
6564
.option(metaData.getOption())
66-
.detectDiff(JSON.toJSONString(metaData.getExpect()) , JSON.toJSONString(metaData.getActual()));
67-
Assert.assertEquals(JSON.toJSONString(jsonCompareResult),JSON.toJSONString(metaData.getRet()));
65+
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
66+
if (metaData.getRet() != null) {
67+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
68+
} else {
69+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent("{\"match\":true}"));
70+
}
6871
}
6972
}

json-diff-test/src/main/java/me/codeleep/jsondiff/test/MultAllObjectTest.java

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import me.codeleep.jsondiff.DefaultJsonDifference;
66
import me.codeleep.jsondiff.test.dataFactory.ObjectDataFactory;
77
import me.codeleep.jsondiff.test.model.MetaData;
8+
import me.codeleep.jsondiff.test.utils.FormatContent;
89
import org.slf4j.Logger;
910
import org.slf4j.LoggerFactory;
1011
import org.testng.Assert;
@@ -22,52 +23,49 @@ public class MultAllObjectTest {
2223
public void noOptionRightTest(MetaData metaData) {
2324
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
2425
logger.info(metaData.getCaseName());
25-
logger.debug(metaData.getExpect().toString()+"\n"+metaData.getActual().toString());
26+
logger.debug(metaData.getExpect().toString() + "\n" + metaData.getActual().toString());
2627
JsonCompareResult jsonCompareResult = defaultJsonDifference
2728
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
2829
if (metaData.getRet() != null) {
29-
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), JSON.toJSONString(metaData.getRet()));
30-
}
31-
32-
else {
33-
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), "{\"match\":true}");
30+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
31+
} else {
32+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent("{\"match\":true}"));
3433
}
3534
}
3635

3736
@Test(dataProvider = "err", dataProviderClass = ObjectDataFactory.class)
3837
public void noOptionErrTest(MetaData metaData) {
3938
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
4039
logger.info(metaData.getCaseName());
41-
logger.debug(metaData.getExpect().toString()+"\n"+metaData.getActual().toString());
40+
logger.debug(metaData.getExpect().toString() + "\n" + metaData.getActual().toString());
4241
JsonCompareResult jsonCompareResult = defaultJsonDifference
4342
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
44-
Assert.assertEquals(JSON.toJSONString(jsonCompareResult),JSON.toJSONString(metaData.getRet()));
43+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
4544
}
4645

4746
@Test(dataProvider = "optionRight", dataProviderClass = ObjectDataFactory.class)
4847
public void optionRight(MetaData metaData) {
4948
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
5049
logger.info(metaData.getCaseName());
51-
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString()+"\n");
50+
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString() + "\n");
5251
JsonCompareResult jsonCompareResult = defaultJsonDifference
5352
.option(metaData.getOption())
5453
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
5554
if (metaData.getRet() != null) {
56-
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), JSON.toJSONString(metaData.getRet()));
57-
}
58-
else {
59-
Assert.assertEquals(JSON.toJSONString(jsonCompareResult), "{\"match\":true}");
55+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
56+
} else {
57+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent("{\"match\":true}"));
6058
}
6159
}
6260

6361
@Test(dataProvider = "optionErr", dataProviderClass = ObjectDataFactory.class)
6462
public void optionErr(MetaData metaData) {
6563
DefaultJsonDifference defaultJsonDifference = new DefaultJsonDifference();
6664
logger.info(metaData.getCaseName());
67-
logger.debug("\n"+metaData.getExpect().toString()+"\n"+metaData.getActual().toString()+"\n");
65+
logger.debug("\n" + metaData.getExpect().toString() + "\n" + metaData.getActual().toString() + "\n");
6866
JsonCompareResult jsonCompareResult = defaultJsonDifference
6967
.option(metaData.getOption())
7068
.detectDiff(JSON.toJSONString(metaData.getExpect()), JSON.toJSONString(metaData.getActual()));
71-
Assert.assertEquals( JSON.toJSONString(jsonCompareResult),JSON.toJSONString(metaData.getRet()));
69+
Assert.assertEquals(FormatContent.formatComparisonContent(jsonCompareResult), FormatContent.formatComparisonContent(metaData.getRet().toString()));
7270
}
7371
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package me.codeleep.jsondiff.test.utils;
2+
3+
import com.alibaba.fastjson2.JSON;
4+
import com.alibaba.fastjson2.JSONObject;
5+
import com.alibaba.fastjson2.JSONWriter;
6+
import me.codeleep.jsondiff.common.model.JsonCompareResult;
7+
8+
import java.util.regex.Matcher;
9+
import java.util.regex.Pattern;
10+
11+
/**
12+
* @author: chenfeng
13+
* @createTime: 2024/4/14 10:55
14+
* @description: 格式化内容
15+
*/
16+
public class FormatContent {
17+
private static final String REGEX = "[a-zA-Z]+(\\.[a-zA-Z0-9]+)+";
18+
private static final Pattern pattern = Pattern.compile(REGEX);
19+
20+
/**
21+
* 将返回的JsonCompareResult类转化为格式化的JSON字符串 并将其中的关于类型的部分去除 例如java.math.BigDecimal
22+
* @param jsonCompareContent JsonCompareResult 执行对比后返回的内容
23+
* @return String 格式化后的JSON字符串
24+
*/
25+
public static String formatComparisonContent(JsonCompareResult jsonCompareContent) {
26+
return formatComparisonContent(JSON.toJSONString(jsonCompareContent));
27+
}
28+
/**
29+
* 将String字符串转化为格式化的JSON字符串 并将其中的关于类型的部分去除 例如java.math.BigDecimal
30+
* @param content String 需要格式化的字符串内容
31+
* @return String 格式化后的JSON字符串
32+
*/
33+
public static String formatComparisonContent(String content) {
34+
Matcher matcher = pattern.matcher(content);
35+
JSONObject jsonObject = JSON.parseObject(matcher.replaceAll(""));
36+
return JSON.toJSONString(jsonObject, JSONWriter.Feature.PrettyFormat);
37+
}
38+
}

0 commit comments

Comments
 (0)