如何为操作之间的双向链表插入编写 junit 测试?
How to write a junit test for double linked list's insertion in between operation?
我有一个双向链表,我可以在其中执行各种功能,但我想编写 JUnit 测试来测试这些功能。
我已经编写了用于测试在末尾和头部插入节点等操作的单元测试,但是如何为 insertion in between 操作编写测试?
谢谢:)
这是我的链表和测试class
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.
}
}
为插入 "inbetween" 或中间编写测试并不难。你可以
- 创建具有预定义长度和条目的列表
- 使用您正在测试的方法向列表中插入一个新项目。
- 至少使用断言来检查新项目是否插入了正确的位置,即
assertEquals(5,dll.get(3))
。 get(int x)
目前尚未实现,但您可以轻松添加并使其成为包私有。
您还应该测试不同的情况,例如插入一个空列表。
事实是:为了使组件有用,它需要 "reasonable" 接口。您当前列表的主要问题是:它没有提供访问其内容的好方法!
很高兴您可以请求列表的 size() - 但您认为用户应该如何检索列表中的每个节点?!
换句话说:退后一步,从 "client" 的角度来看一个列表,它会实例化这样一个列表来存储数据。这样的用户需要您目前提供的方法;但用户不想通过某种方式以一种简单、可靠的方式迭代列表中的所有元素吗?!
例如,您可以实现一个 returns 某种 迭代器 的方法,它允许您在列表中 forward/backward 。一旦有了这样的功能,编写缺少的测试就会变得非常简单:
- 您创建一个具有特定布局的列表,可能是 1-2-4-5
- 你在2-4之间插入一个新节点3
- 您迭代新列表,并期望它包含 1-2-3-4-5
当然,你有一个双链表,你应该在 "both directions" 中测试迭代。
长话短说:当您进行初始设计时;不要太在意前期的细节。相反,首先尝试找出最重要的 "use cases";换句话说:“尝试获得 'whole picture'(而不是预先关注太低级的细节)。
我有一个双向链表,我可以在其中执行各种功能,但我想编写 JUnit 测试来测试这些功能。 我已经编写了用于测试在末尾和头部插入节点等操作的单元测试,但是如何为 insertion in between 操作编写测试?
谢谢:)
这是我的链表和测试class
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.
}
}
为插入 "inbetween" 或中间编写测试并不难。你可以
- 创建具有预定义长度和条目的列表
- 使用您正在测试的方法向列表中插入一个新项目。
- 至少使用断言来检查新项目是否插入了正确的位置,即
assertEquals(5,dll.get(3))
。get(int x)
目前尚未实现,但您可以轻松添加并使其成为包私有。
您还应该测试不同的情况,例如插入一个空列表。
事实是:为了使组件有用,它需要 "reasonable" 接口。您当前列表的主要问题是:它没有提供访问其内容的好方法!
很高兴您可以请求列表的 size() - 但您认为用户应该如何检索列表中的每个节点?!
换句话说:退后一步,从 "client" 的角度来看一个列表,它会实例化这样一个列表来存储数据。这样的用户需要您目前提供的方法;但用户不想通过某种方式以一种简单、可靠的方式迭代列表中的所有元素吗?!
例如,您可以实现一个 returns 某种 迭代器 的方法,它允许您在列表中 forward/backward 。一旦有了这样的功能,编写缺少的测试就会变得非常简单:
- 您创建一个具有特定布局的列表,可能是 1-2-4-5
- 你在2-4之间插入一个新节点3
- 您迭代新列表,并期望它包含 1-2-3-4-5
当然,你有一个双链表,你应该在 "both directions" 中测试迭代。
长话短说:当您进行初始设计时;不要太在意前期的细节。相反,首先尝试找出最重要的 "use cases";换句话说:“尝试获得 'whole picture'(而不是预先关注太低级的细节)。