簡體   English   中英

JUnit:比較兩個包含List的bean,而不管列表順序如何

[英]JUnit: compare two beans that contain a List regardless of list order

我發現了很多關於比較List對象而不考慮其元素順序的問題和答案,但是我的問題更加復雜:我有兩個bean,其中除其他屬性外還包含一個List。 我想對兩個bean執行一次assertEquals,而不管內部列表中元素的順序如何。 有沒有簡單的方法可以做到這一點?

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

}

當您斷言assertEquals(expectedObject,ActualObject)時,junit會實際調用對象的equal方法。因此,我的建議是,如果您覆蓋equal方法,那么您可以實現期望的結果。

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 )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM