Утверждение о списке в 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.

См. JavaDocs интерфейса 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), если вы не хотите включать какие-либо поля в равную проверку объектов. Есть много аннотаций, подобных этому для настройки, поэтому обратите внимание на аннотации этой библиотеки.

Я уверен, что этот ответ сэкономит ваше время, чтобы определить правильный подход для сравнения двух списков объектов :). Прокомментируйте, если вы видите какие-либо вопросы по этому поводу.