Java 使用Junit5和Mockito比较2个Json字符串

Java 使用Junit5和Mockito比较2个Json字符串,java,junit,jackson,mockito,junit5,Java,Junit,Jackson,Mockito,Junit5,我有下面的Junit。我试图测试比较两个Json字符串是否具有相同的字段(顺序和值不重要)。我的测试不断失败,错误如下 org.opentest4j.AssertionFailedError:应为: 但是: 比较之前,请尝试使用trim() assertEquals(bean.trim(),jsonString.trim()); 这里还有一些危险的陷阱,如评论中提到的njzk2。它与trim()一起工作,因为Jackson按照bean中声明的顺序使用JsonProperties,并且其中一个

我有下面的Junit。我试图测试比较两个Json字符串是否具有相同的字段(顺序和值不重要)。我的测试不断失败,错误如下

org.opentest4j.AssertionFailedError:应为: 但是: 比较之前,请尝试使用
trim()

assertEquals(bean.trim(),jsonString.trim()); 
这里还有一些危险的陷阱,如评论中提到的njzk2。它与
trim()
一起工作,因为Jackson按照bean中声明的顺序使用JsonProperties,并且其中一个或两个字符串中存在一些空格

但是,对于将来的版本来说,这并不安全。尝试比较实际对象而不是字符串

String path = "src/test/data/json_file.txt";
String jsonString = new String(Files.readAllBytes(Paths.get(path)));

ObjectMapper objectMapper = new ObjectMapper(); 
Person bean1 =objectMapper.readValue(jsonString, Person.class);

Input i = new Input();
Person bean2 =objectMapper.readValue(i, Person.class);
  
assertEquals(bean1, bean2); 
 }
另外,在类中,不要忘记重写基于类字段的比较的
.equals()
.hashcode()
方法。

在比较之前尝试使用
trim()

assertEquals(bean.trim(),jsonString.trim()); 
这里还有一些危险的陷阱,如评论中提到的njzk2。它与
trim()
一起工作,因为Jackson按照bean中声明的顺序使用JsonProperties,并且其中一个或两个字符串中存在一些空格

但是,对于将来的版本来说,这并不安全。尝试比较实际对象而不是字符串

String path = "src/test/data/json_file.txt";
String jsonString = new String(Files.readAllBytes(Paths.get(path)));

ObjectMapper objectMapper = new ObjectMapper(); 
Person bean1 =objectMapper.readValue(jsonString, Person.class);

Input i = new Input();
Person bean2 =objectMapper.readValue(i, Person.class);
  
assertEquals(bean1, bean2); 
 }

另外,在类中,不要忘记重写基于类字段的比较的
.equals()
.hashcode()
方法。

我建议不要使用原始字符串比较 (正如在JUnit的
assertEquals
中所做的那样)

相反,您应该使用一个库来比较 逻辑级别上的预期JSON和实际JSON (即忽略空白和属性序列)。 有关更多信息,请参阅和

使用这个库,您可以比较两个JSON字符串,而不是

assertEquals(bean, jsonString, true);
而是

JSONAssert.assertEquals(bean, jsonString, true);

然后,只有在存在“真实”差异的情况下,才会出现断言错误。

我建议根本不要使用原始字符串比较 (正如在JUnit的
assertEquals
中所做的那样)

相反,您应该使用一个库来比较 逻辑级别上的预期JSON和实际JSON (即忽略空白和属性序列)。 有关更多信息,请参阅和

使用这个库,您可以比较两个JSON字符串,而不是

assertEquals(bean, jsonString, true);
而是

JSONAssert.assertEquals(bean, jsonString, true);

只有在“真实”差异的情况下,才会出现断言错误。

trim有效,assertTrue失败。是的,可能是消息中没有打印的空白,因为它已在outputjson中被修剪。JSON标准没有指定键顺序,或令牌之间的空格,因此,两个字符串可以表示同一个对象,但不能表示为equaltrim works,assertTrue失败。是的,可能是消息中没有打印的空格,因为它已在outputjson中被修剪。JSON标准没有指定键顺序,或令牌之间的空格,因此,两个字符串可以表示相同的对象,但不能相等。不能保证键将以相同的顺序写入,因此比较json字符串是没有意义的。相反,使用
valueToTree
readTree
@njzk2来比较节点,我可以通过在输入类中使用JsonOrder注释来进行排序。但是我想使用
valueToTree
是一个更好的测试。无法保证键将以相同的顺序写入,因此比较json字符串是毫无意义的。相反,使用
valueToTree
readTree
@njzk2比较节点,我可以通过在输入类中使用JsonOrder注释进行排序。但是我想使用
valueToTree
是一个更好的测试