在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))
那么两个元素e1
和e2
是相等的。)换句话说,如果两个列表包含相同元素的顺序相同。 此定义确保了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 }