JUnit 4比较集

Eqb*_*bal 96 java collections junit unit-testing

你会如何简洁地断言Collection元素的相等性,特别是Set在JUnit 4中?

Bil*_*ard 99

您可以断言两个Sets彼此相等,从而调用该Set equals()方法.

public class SimpleTest {

    private Set<String> setA;
    private Set<String> setB;

    @Before
    public void setUp() {
        setA = new HashSet<String>();
        setA.add("Testing...");
        setB = new HashSet<String>();
        setB.add("Testing...");
    }

    @Test
    public void testEqualSets() {
        assertEquals( setA, setB );
    }
}
Run Code Online (Sandbox Code Playgroud)

@Test如果两个将传递Sets为相同的大小和包含相同的元素.

  • 这在报告中没有显示出非常好的结果.如果你的toStrings是明确定义的,那就更好了,但仍然不好(一小部分差异最终会出现一页文字) (6认同)
  • 也适用于地图. (2认同)
  • @Giodude你在你的Hashtable中存储的类中实现了`equals`和`hashCode`吗? (2认同)

Mat*_*man 43

阿帕奇再次宣传救援.

assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Run Code Online (Sandbox Code Playgroud)

奇迹般有效.我不知道为什么,但我发现对于集合,以下assertEquals(coll1, coll2)并不总是有效.在我失败的情况下,我有两个由Sets支持的集合.即使我确定他们是肯定的,所以无论是汉克雷斯特还是君子都不会说收藏品是平等的.使用CollectionUtils它完美地工作.

  • 这实际上是微不足道的,棘手的部分是清楚地表明与调用者的区别 (19认同)
  • 接受的答案是原始问题的一个很好的答案(专门针对两个 Sets 的单元测试),但是我认为 CollectionUtils 的这个答案是最一般情况的更好答案。除非使用 CollectionUtils,否则我无法比较 Collection 和 Set。 (2认同)

dfa*_*dfa 15

hamcrest:

assertThat(s1, is(s2));
Run Code Online (Sandbox Code Playgroud)

明确断言:

assertEquals(s1, s2);
Run Code Online (Sandbox Code Playgroud)

注意:使用具体集合类的equals()方法

  • 当集合具有不同类型时,这可能不起作用. (2认同)

小智 7

比较一个特别有趣的案例

   java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]> 
Run Code Online (Sandbox Code Playgroud)

   java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
Run Code Online (Sandbox Code Playgroud)

到目前为止,我看到的唯一解决方案是将它们都变成集合

assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
Run Code Online (Sandbox Code Playgroud)

或者我可以逐个元素地比较它们.