Тестирование связанного списка .... Проблема типа возврата - PullRequest
1 голос
/ 07 ноября 2019

У меня есть этот код класса IntLinkedList

public class IntLinkedList {

    private Node head;

    public void addFirst(int data) {
        head = new Node(data, head);
    }

    public Node copy(){
       Node current = head; // used to iterate over original list
       Node newList = null; // head of the new list
       Node tail = null;    // point to last node in new list

       while (current != null)
       {
        // special case for the first new node
          if (newList == null)
          {
              newList = new Node(current.data, null);
              tail = newList;
          }
          else
          {
              tail.next = new Node(current.data, null);
              tail = tail.next;
          }
          current = current.next;
       }
       return newList;
    }


    private class Node  {
            int data;
            Node next;

        Node(int data, Node next) {
            this.data = data;
            this.next = next;
        }
    }
}

И я пытаюсь протестировать метод копирования с помощью следующего кода JUnit

public class IntLinkedListTest {

    /** Reference to linked list under test */
    private IntLinkedList lst;

    /** Creates a linked list for testing. */
    @Before
    public void setUp() {
        lst = new IntLinkedList();

        lst.addFirst(30);
        lst.addFirst(10);
        lst.addFirst(40);
        lst.addFirst(20);
    }

    /** Tests copying a non-empty list. */
    @Test
    public void testCopy() {
        IntLinkedList cpy = lst.copy();
        assertEquals(lst.toString(), cpy.toString());
    }
}

Я хочу получить возвращенный списокиз класса IntLinkedList из метода Copy () и протестирован в JUnit. Я попытался вернуть возвращаемый тип IntLinkedList и Object, но у меня продолжают появляться ошибки типа «Несоответствие типов: невозможно преобразовать из IntLinkedList.Node в IntLinkedList». У меня очень мало опыта работы с LinkedList, но у меня есть опыт работы с Java-классами, ссылками на объекты, но для меня это новая территория. Кто-нибудь может помочь?

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Это последний метод IntLinkedList copy () с более элегантным решением моей проблемы. Я публикую только метод copy (), поскольку класс IntLinkedList остается тем же, а тестирование JUnit остается тем же. Примечание. В классе IntLinkedList изменяется только метод copy ()

public IntLinkedList copy(){
    IntLinkedList newList = new IntLinkedList();
    Node current = head;    // used to iterate over original list
    Node tail = null;   // point to last node in new list

    while (current != null)
    {
        // special case for the first new node
        if (newList.head == null)
        {
            newList.head = new Node(current.data, null);
            tail = newList.head;
        }
        else
        {
            tail.next = new Node(current.data, null);
            tail = tail.next;
        }
        current = current.next;
    }

    return newList;
}
1 голос
/ 07 ноября 2019

Решение : - Вы сравниваете Node class toString с IntLinkedList class toString, следовательно, с ошибкой Junit. Попробуйте переопределить метод toString() класса Node и IntLinkedList, вы четко увидите стекtrace as

org.junit.ComparisonFailure: expected:<[IntLinkedList [head=Node [data=20, next=Node [data=40, next=Node [data=10, next=Node [data=30, next=null]]]]]]> but was:<[Node [data=20, next=Node [data=40, next=Node [data=10, next=Node [data=30, next=null]]]]]>

Этот Junit работает должным образом

 @Test
    public void testCopy() {
        IntLinkedList.Node cpy = lst.copy();
        assertEquals(lst.copy().toString(), cpy.toString());
    }

Редактировать : - Я внес одно незначительное изменение, чтобы IntLinkedList.Node заработало с вашего узлакласс является закрытым, поэтому я изменил сигнатуру на статическую, чтобы джунит работал, т.е.

static class Node  {
0 голосов
/ 07 ноября 2019

Хм.

Ваш copy() должен imho не возвращать Node, но IntLinkedList Таким образом, вам необходимо соответствующим образом настроить код copy().

Также внедрите equals()hashCode()) в вашем IntLinkedList классе. Реализация equals должна соответствовать вашему ожиданию, когда два IntLinkedList равны.

Позже в тесте используйте InLinkedList copy = copy(orig) и сравните результат с Assert.equals(orig, copy).

...