在Junit声明列表

如何在JUnittesting用例中声明列表? 不仅列表的大小,而且列表的内容。

我意识到这是几年前问的,可能这个function不在那个时候。 但是现在,这样做很容易:

@Test public void test_array_pass() { List<String> actual = Arrays.asList("fee", "fi", "foe"); List<String> expected = Arrays.asList("fee", "fi", "foe"); assertThat(actual, is(expected)); assertThat(actual, is(not(expected))); } 

如果你有最新版本的安装了hamcrest的Junit,只需添加这些导入:

 import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; 

http://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThat(T,org.hamcrest.Matcher);

http://junit.org/junit4/javadoc/latest/org/hamcrest/CoreMatchers.html

http://junit.org/junit4/javadoc/latest/org/hamcrest/core/Is.html

这是一个遗留的答案,适用于JUnit 4.3及更低版本。 现代版本的JUnit在assertThat方法中包含一个内置的可读的失败消息。 如果可能的话,优先select其他的答案。

 List<E> a = resultFromTest(); List<E> expected = Arrays.asList(new E(), new E(), ...); assertTrue("Expected 'a' and 'expected' to be equal."+ "\n 'a' = "+a+ "\n 'expected' = "+expected, expected.equals(a)); 

正如@Paul在他对这个答案的评论中提到的那样,两个List是相等的:

当且仅当指定的对象也是列表时,两个列表具有相同的大小,并且两个列表中的所有对应元素对相等。 (如果(e1==null ? e2==null : e1.equals(e2))那么两个元素e1e2是相等的。)换句话说,如果两个列表包含相同元素的顺序相同。 此定义确保了equals方法在List接口的不同实现之间正常工作。

请参阅List接口的JavaDocs 。

不要转换为string并进行比较。 这不利于性能。 在Corematchers内部的junit中,有一个匹配器hasItems = hasItems

 List<Integer> yourList = Arrays.asList(1,2,3,4) assertThat(yourList, CoreMatchers.hasItems(1,2,3,4,5)); 

这是我知道检查列表中的元素的更好的方法。

如果你不关心元素的顺序,我build议在junit-addons中使用ListAssert.assertEquals

链接: http : //junit-addons.sourceforge.net/

对于懒惰的Maven用户:

  <dependency> <groupId>junit-addons</groupId> <artifactId>junit-addons</artifactId> <version>1.4</version> <scope>test</scope> </dependency> 
 List<Integer> figureTypes = new ArrayList<Integer>( Arrays.asList( 1, 2 )); List<Integer> figureTypes2 = new ArrayList<Integer>( Arrays.asList( 1, 2)); assertTrue(figureTypes .equals(figureTypes2 )); 

不要重新发明轮子!

有一个谷歌代码库为你做这个: Hamcrest

[Hamcrest]提供一个matcher对象库(也称为约束或谓词),允许“匹配”规则以声明方式定义,以用于其他框架。 典型的场景包括testing框架,模拟库和UIvalidation规则。

如果你不想build立一个数组列表,你也可以试试这个

 @Test public void test_array_pass() { List<String> list = Arrays.asList("fee", "fi", "foe"); Strint listToString = list.toString(); Assert.assertTrue(listToString.contains("[fee, fi, foe]")); // passes }