当前位置: 首页 > 知识库问答 >
问题:

JUnit~断言list以任意顺序包含具有相同值的对象

林劲
2023-03-14

要抽象出来,请考虑以下示例:

Apple referenceApple1 = new Apple(color="red");
Apple referenceApple2 = new Apple(color="green");
Apple parsedApple1 = new Apple(color="red");
Apple parsedApple2 = new Apple(color="green");
Apple badApple = new Apple(color="brown");

List<Apple> referenceList = new List<Apple>(referenceApple1, referenceApple2);
List<Apple> correctlyParsedList1 = new List<Apple>(parsedApple1, parsedApple2);
List<Apple> correctlyParsedList2 = new List<Apple>(parsedApple2, parsedApple1);
List<Apple> wronglyParsedList1 = new List<Apple>(parsedApple1, badApple);
List<Apple> wronglyParsedList2 = new List<Apple>(parsedApple1, parsedApple2, parsedApple1);
List<Apple> wronglyParsedList3 = new List<Apple>(parsedApple2, parsedApple2);

我正在寻找一个断言方法,该方法在比较上述任何correctlyParsedList*referencelist时通过,但在比较上述任何werrlyParsedList*referencelist时失败。

目前,我最接近的是:

assertEquals(referenceList.toString(), correctlyParsedList1.toString())
//Will fail, but I want a method that will compare these and pass
assertEquals(referenceList.toString(), correctlyParsedList2.toString())

值得注意的是,以下操作也将失败,因为Apples虽然包含相同的值,但不是相同对象的html" target="_blank">实例:

assertThat(correctlyParsedList1, is(referenceList));

//Throws This error:
java.lang.AssertionError: 
Expected: is <[[color="red"], [color="green"]]>
     but: was <[[color="red"], [color="green"]]>

在JUnit中有没有一种简单的方法来做出这样的断言?我知道我可以为对象的迭代编写一个自定义断言方法,但不知何故,这似乎是一个常见的用例,应该有一个预定义的断言方法,该方法会引发表达性断言错误。

编辑~具体化

在这个抽象示例中,我实际上试图使用JDOM2解析复杂的XML,我希望断言被解析的标记的属性与我作为输入给出的示例文档中的属性相同。由于这是XML,属性的顺序是不相关的,只要它们有正确的值。

因此,在这个实际用例中,我比较的是两个列表 ,其中attribute来自org.jdom2.attribute

完整的临时testcase是我目前不满意的,因为如果属性的顺序改变,它将失败,但不应该这样做:

    @Test
    public void importXML_fromFileShouldCreateXML_objectWithCorrectAttributes() throws JDOMException, IOException {
        testInitialization();
        List<Attribute> expectedAttributes = rootNode.getAttributes();

        XML_data generatedXML_data = xml_importer.importXML_fromFile(inputFile);
        List<Attribute> actualAttributes = generatedXML_data.attributes;

        assertEquals(expectedAttributes.toString(), actualAttributes.toString());
    }

在尝试使用assertThat(expectedAttributes,is(actualAttributes))进行断言时,我得到的具体错误是:

java.lang.AssertionError: 
Expected: is <[[Attribute: xsi:schemaLocation="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd http://www.omg.org/spec/ReqIF/20110401/reqif.xsd"], [Attribute: xml:lang="en"]]>
    but: was <[[Attribute: xsi:schemaLocation="http://www.omg.org/spec/ReqIF/20110401/reqif.xsd http://www.omg.org/spec/ReqIF/20110401/reqif.xsd"], [Attribute: xml:lang="en"]]>

共有1个答案

姬俊能
2023-03-14

您应该使用containsAll检查一个列表是否包含另一个列表中的所有项,只要您的Apple有正确的equals实现,这应该可以:

    // Covers case where all items that are from correct list are in reference as well
    // but also some additional items exist that are not in correct list
    assertEquals(correctlyPassedList.size(), referenceList.size());
    // Checks if each element is contained in list
    assertTrue(referenceList.containsAll(correctlyPassedList));

更新

关于你最近的评论,这可能是最好的:

    // Sort both lists using comparator based on id or whatever field is relevant
    referenceList.sort(Comparator.comparingInt(Apple::getId));
    correctlyParsedList.sort(Comparator.comparingInt(Apple::getId));
    // Check if they are equal
    assertEquals(correctlyParsedList, referenceList);
 类似资料:
  • 我想通过使用JUnit创建单元测试来测试某些字符串列表是否正确生成。 我有两个字符串列表(我的代码中的一个列表是private static final,比方说列表1),它们以不同的顺序使用相同的元素(相同的元素可以相乘): 我不想使用这种类型的函数,因为它只适用于少量元素:

  • 的顺序将与为创建对象选择的顺序相同 允许重复的后续字符串组件并按顺序保留 未定义的行为(其他代码保证没有进入工厂) 在对象实例化之后,没有任何方法可以更改组件列表 我正在编写一个简单的测试,该测试从字符串列表创建并检查它是否可以通过返回相同的列表。我立即这样做,但这应该发生在一个现实的代码路径的远处。 这里是我的尝试: null null

  • 问题内容: 我在用Maven或Eclipse编译一些Scala时遇到问题,我尝试从Java jar导入一个包含名称空间和同名类的类。 我可以用编译。 例如,Java项目(jar)包含: 编译器抱怨: 在Scala 2.9.0.1(和)中使用Maven 3.0.03 / Eclipse 3.7.1 。 我遇到问题的jar是-它肯定包含几个实例,其中存在同名的名称空间和对象。 我正在尝试在Scala中

  • 问题内容: 我如何测试python中两个JSON对象是否相等,而忽略列表的顺序? 例如 … JSON文档a: JSON文档b: 并且应该比较相等,即使列表的顺序不同。 问题答案: 如果你想要两个具有相同元素但顺序不同的对象相等,那么显而易见的事情是比较它们的排序后的副本-例如,以JSON字符串和表示的字典: …但这是行不通的,因为在每种情况下,”errors”顶层dict的项都是具有相同元素的列表

  • 我想检查两个列表(比方说,ArrayList)是否有完全相同的实例类,基于预期的列表。为此,我构建了下一个方法,但我想知道是否有另一种使用某些库的奇特方法,比如assertJ。 任何建议都是非常受欢迎的。谢谢

  • 问题内容: 我如何测试python中两个JSON对象是否相等,而忽略列表的顺序? 例如 … JSON文档 a : JSON文档 b : 并且即使列表的顺序不同,也应该比较相等。 问题答案: 如果要使两个具有相同元素但顺序不同的对象相等,那么显而易见的事情是比较它们的排序后的副本-例如,以JSON字符串和表示的字典: …但这是行不通的,因为在每种情况下,顶层dict的项都是具有相同元素的列表,但是顺