JUnit:比较包含列表的两个 Bean,而不考虑列表顺序



我找到了很多关于比较List对象的问题和答案,无论其元素的顺序如何,但我的问题更复杂:我有两个豆子,除其他属性外,还包含一个List。 我想执行两个 bean 的断言等于,而不管内部列表中元素的顺序如何。 有没有简单的方法可以做到这一点?

当你做断言等于(预期对象,实际对象(在幕后,junit实际上调用了对象的equal方法。所以我的建议是,如果你覆盖你的平等方法,那么你可以实现你所期望的。

断言等于背后的逻辑。

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 实用程序可用于检查两个对象而无需相等的方法覆盖

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

应用程序接口

EqualsBuilder.reflectionEquals( obj1, obj2 )

我想你可以在这里找到答案。这个想法是使用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()));
    }
}

最新更新