Как сделать утверждения о списке в тестовом примере JUnit? Не только размер списка, но и содержимое списка.
Утверждение о списке в Junit
Ответ 1
Я понимаю, что это было задано пару лет назад, вероятно, эта функция не была тогда. Но теперь легко сделать это:
@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)));
}
Если у вас установлена последняя версия Junit с hamcrest, просто добавьте эти импорты:
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
Ответ 2
Это устаревший ответ, подходящий для JUnit 4.3 и ниже. Современная версия JUnit включает встроенные считываемые сообщения об ошибках в методе assertThat. Предположите другие ответы по этому вопросу, если это возможно.
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
иe2
равны, если(e1==null ? e2==null : e1.equals(e2))
.) Другими словами, два списка определены равными, если они содержат одни и те же элементы в одном порядке. Это определение гарантирует, что метод equals корректно работает в разных реализациях интерфейсаList
.
Ответ 3
Не преобразовывайте в строку и сравнивайте. Это не хорошо для исполнения.
В junit, внутри Corematchers, есть помощник для этого = > hasItems
List<Integer> yourList = Arrays.asList(1,2,3,4)
assertThat(yourList, CoreMatchers.hasItems(1,2,3,4,5));
Это лучший способ проверить элементы в списке.
Ответ 4
Если вы не заботитесь о порядке элементов, я рекомендую ListAssert.assertEquals
в junit-addons.
Ссылка: http://junit-addons.sourceforge.net/
Для ленивых пользователей Maven:
<dependency>
<groupId>junit-addons</groupId>
<artifactId>junit-addons</artifactId>
<version>1.4</version>
<scope>test</scope>
</dependency>
Ответ 5
List<Integer> figureTypes = new ArrayList<Integer>(
Arrays.asList(
1,
2
));
List<Integer> figureTypes2 = new ArrayList<Integer>(
Arrays.asList(
1,
2));
assertTrue(figureTypes .equals(figureTypes2 ));
Ответ 6
если вы не хотите создавать список массивов, вы можете попробовать это также
@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
}
Ответ 7
Не изобретайте велосипед!
Здесь есть библиотека Google Code, которая делает это для вас: Hamcrest
[Hamcrest] Предоставляет библиотеку объектов-совпадений (также называемых ограничениями или предикатами), позволяющих декларативно определять правила соответствия, которые будут использоваться в других рамках. Типичные сценарии включают в себя тестовые рамки, насмешливые библиотеки и правила проверки UI.
Ответ 8
Вы можете использовать assertEquals в junit.
import org.junit.Assert;
import org.junit.Test;
@Test
public void test_array_pass()
{
List<String> actual = Arrays.asList("fee", "fi", "foe");
List<String> expected = Arrays.asList("fee", "fi", "foe");
Assert.assertEquals(actual,expected);
}
Если порядок элементов различен, тогда он будет возвращать ошибку.
Если вы утверждаете список объектов модели, вы должны переопределить метод equals в конкретной модели.
@Override public boolean equals(Object obj) { if (obj == this) { return true; } if (obj != null && obj instanceof ModelName) { ModelName other = (ModelName) obj; return this.getItem().equals(other.getItem()) ; } return false; }
Ответ 9
Я не так, все приведенные выше ответы дают точное решение для сравнения двух списков объектов. Большинство приведенных выше подходов могут быть полезны в следующем пределе сравнений - Сравнение размеров - Сравнительное сравнение
Но если у нас одинаковые списки объектов и разные данные на уровне объектов, то это сравнение не поможет.
Я думаю, что следующий подход будет отлично работать с переопределением значений equals и hashcode на пользовательском объекте.
Я использовал Xstream lib для переопределения equals и hashcode, но мы можем переопределить equals и hashcode, выиграв логику/сравнение.
Вот пример для вашей справки
import com.thoughtworks.xstream.XStream;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
class TestClass {
private String name;
private String id;
public void setName(String value) {
this.name = value;
}
public String getName() {
return this.name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object o) {
XStream xstream = new XStream();
String oxml = xstream.toXML(o);
String myxml = xstream.toXML(this);
return myxml.equals(oxml);
}
/**
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
XStream xstream = new XStream();
String myxml = xstream.toXML(this);
return myxml.hashCode();
}
}
public class XstreamCompareTest {
public static void main(String[] args) throws ParseException {
checkObjectEquals();
}
private static void checkObjectEquals() {
List<TestClass> testList1 = new ArrayList<TestClass>();
TestClass tObj1 = new TestClass();
tObj1.setId("test3");
tObj1.setName("testname3");
testList1.add(tObj1);
TestClass tObj2 = new TestClass();
tObj2.setId("test2");
tObj2.setName("testname2");
testList1.add(tObj2);
testList1.sort((TestClass t1, TestClass t2) -> t1.getId().compareTo(t2.getId()));
List<TestClass> testList2 = new ArrayList<TestClass>();
TestClass tObj3 = new TestClass();
tObj3.setId("test3");
tObj3.setName("testname3");
testList2.add(tObj3);
TestClass tObj4 = new TestClass();
tObj4.setId("test2");
tObj4.setName("testname2");
testList2.add(tObj4);
testList2.sort((TestClass t1, TestClass t2) -> t1.getId().compareTo(t2.getId()));
if (isNotMatch(testList1, testList2)) {
System.out.println("The list are not matched");
} else {
System.out.println("The list are matched");
}
}
private static boolean isNotMatch(List<TestClass> clist1, List<TestClass> clist2) {
return clist1.size() != clist2.size() || !clist1.equals(clist2);
}
}
Самое главное, что вы можете игнорировать поля Annotation (@XStreamOmitField), если вы не хотите включать какие-либо поля в равную проверку объектов. Есть много аннотаций, подобных этому для настройки, поэтому обратите внимание на аннотации этой библиотеки.
Я уверен, что этот ответ сэкономит ваше время, чтобы определить правильный подход для сравнения двух списков объектов :). Прокомментируйте, если вы видите какие-либо вопросы по этому поводу.