2017-06-08 65 views
0

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

回答

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())); 
    } 

} 
+0

不,我不想比較兩個名單:我想比較兩個包含List和其他屬性的bean。 – Pino

+0

@Pino抱歉誤會。如果您添加一些代碼以更好地瞭解您的情況,那將會很不錯 –

0

當你這樣做的assertEquals(expectedObject,actualObject)現場JUnit的實際調用對象的平等method.So背後如果重寫你的對手的方法,那麼你可以達到你期待什麼我的建議會。

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可檢查兩個對象不等於方法overiding

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

API

EqualsBuilder.reflectionEquals(obj1, obj2) 
+0

是的,我知道。而不改變equals()?任何「聰明」圖書館? – Pino

+0

@Pino你可以看看[assertj](http://joel-costigliola.github.io/assertj/)它有很多很酷的API方法用於這個目的。 –