如何在操作之间编写双链表插入的junit测试?

时间:2016-08-30 19:20:43

标签: java unit-testing junit linked-list doubly-linked-list

我有一个双链表,我可以在其中执行各种功能,但我想编写JUnit测试来测试这些功能。 我已经为测试操作编写了单元测试,例如在end和head处插入节点,但是如何在插入操作之间编写测试?

谢谢:)

这是我的链表和测试类

DoubleLinkedList.java

public class DoubleLinkedList {

  Node head;

  public void add(int data) {
      Node newNode = new Node(data);
      if (head == null) {
        head = newNode;
      } else {
        Node current = head;
        while (current.next != null) {
            current = current.next;
        }
        current.next = newNode;
        newNode.prev = current;
      }
  }

  public void print() {
      Node current = head;
      while (current != null) {
          System.out.print(current.data);
          if (current.next != null)
              System.out.print(" -> ");
          current = current.next;
      }
      System.out.println();
  }

  public int size() {
      int size = 0;
      Node current = head;
      while (current != null) {
          size++;
          current = current.next;
      }
      return size;
  }

  public void addIntoHead(int data) {
      Node newNode = new Node(data);

     if (head == null) {
          head = newNode;
      } else {
          head.prev = newNode;
          newNode.next = head;
          head = newNode;
      }
  }

  public int returnHead() {
      return head.data;
  }

  public void addInMiddle(int prevData, int data) {
      Node current = head;
      while (current != null) {
        if (current.data != prevData) {
            current = current.next;
        } else{
            break;
        }
      }
      Node newNode = new Node(data);
      newNode.next = current.next;
      current.next.prev = newNode;
      newNode.prev = current;
      current.next = newNode;
  }

}

DoubleLinkedListTest.java

import org.junit.Test;
import static org.junit.Assert.*;

public class DoubleLinkedListTest {

  private DoubleLinkedList dll;

  @org.junit.Before
  public void setUp() throws Exception {
      dll = new DoubleLinkedList();
  }

  @Test
  public void shouldBeAbleToCreateANewNode() throws Exception {
      int initialSizeBeforeAdd = dll.size();

      dll.add(1);
      dll.add(2);

      assertEquals(initialSizeBeforeAdd+2,dll.size());
  }

  @Test
  public void shouldAbleToAddIntoHead() throws Exception {
      dll.add(1);
      dll.add(2);

      dll.addIntoHead(0);

      assertEquals(0,dll.returnHead());
  }

  @Test
  public void shouldAbleToAddDataInMiddle() throws Exception {
      dll.add(1);
      dll.add(2);
      dll.add(4);
      int size = dll.size();

      dll.addInMiddle(2,3);

    //what should be the assertion here.
  }
}

2 个答案:

答案 0 :(得分:2)

编写插入“中间”或中间的测试并不困难。你可以

  • 创建一个包含预定长度和条目的列表
  • 使用测试中的方法将新项目插入列表。
  • 至少使用断言来检查新项目是否插入到正确的位置,即assertEquals(5,dll.get(3))get(int x)目前尚未实施,但您可以轻松添加,并将其设为私有。

您还应该测试不同的情况,例如:插入空列表。

答案 1 :(得分:1)

事情是:为了使组件有用,它需要"合理的"接口。您当前列表的主要问题是:它没有提供访问其内容的好方法!

很高兴您可以询问列表的大小() - 但您认为用户应如何检索列表中的每个节点?!

换句话说:退一步,从客户的角度看一个列表"这将实例化这样的列表来存储数据。这样的用户需要你目前提供的方法;但用户是否希望以一种简单,可靠的方式迭代列表中的所有元素?!

例如,您可以实现一个返回某种迭代器的方法,该方法允许您在列表中前进/后退。只要你有这样的功能,写下你缺少的测试就变得非常简单了:

  1. 您创建一个具有特定布局的列表,可能是1-2-4-5
  2. 您在2-4
  3. 之间插入新节点3
  4. 您迭代新列表,并期望它包含1-2-3-4-5
  5. 当然,你有一个双链表,你应该在"两个方向"中测试迭代。

    长话短说:当你进行初步设计时;不要过早挂在细节上。相反,试着找出最重要的"用例"第一;换句话说:"尝试获得整个图片' (而不是前面关注太低级别的细节)。