JUnit:比较包含List的两个bean,而不管列表顺序如何

时间:2017-06-08 10:25:53

标签: java list junit comparison

我发现了许多关于比较List对象的问题和答案,无论它们的元素顺序如何,但我的问题更复杂:我有两个bean,其中包含一个List。我想执行两个bean的assertEquals,而不管内部列表中元素的顺序如何。有一种简单的方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:0)

我猜你可以找到答案here。想法是使用hamcrest断言。

import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.junit.Assert.assertThat;

public class CompareListTest {

    @Test
    public void compareList() {
        List<String> expected = Arrays.asList("String A", "String B");
        List<String> actual = Arrays.asList("String B", "String A");

        assertThat("List equality without order", 
            actual, containsInAnyOrder(expected.toArray()));
    }

}

答案 1 :(得分:0)

当你做assertEquals(expectedObject,actualObject)在场景后面,junit实际上调用了对象的相等方法。所以我的建议是,如果你覆盖你的平等方法,那么你可以实现你期望的。

assertEqual背后的逻辑。

String expectedString = String.valueOf(expected);
String actualString = String.valueOf(actual);
 if (expectedString.equals(actualString)) {
            return formatted + "expected: "
                    + formatClassAndValue(expected, expectedString)
                    + " but was: " + formatClassAndValue(actual, actualString);
        } else {
            return formatted + "expected:<" + expectedString + "> but was:<"
                    + actualString + ">";
        }

或Apache util可用于检查两个对象,而没有相同的方法覆盖

<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5</version>
        </dependency>

API

EqualsBuilder.reflectionEquals( obj1, obj2 )