[英]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.