我正在Java中实现一个单向链表。我创建了一个名为reverseList的方法,它可以反转我的列表,例如:
头部 -> 1 -> 2 -> 3 -> 空
变为:
头 -> 3 -> 2 -> 1 -> 空
我还创建了一个测试类(使用 JUnit(,其中包含一个名为testReverseList的方法,用于测试reverseList方法。insert方法获取数据以及要添加新节点的位置。所有这三种方法似乎都正常工作。
public String reverseList() {
Node prev = null, current = head, next;
StringBuilder checkList = new StringBuilder();
while (current != null) {
checkList.append(current.getData());
next = current.getNext();
current.setNext(prev);
prev = current;
current = next;
}
head = prev;
return checkList.toString();
}
@Test
public void testReverseList() {
LinkedList myList = new LinkedList();
myList.insert(1, 1);
myList.insert(2, 2);
myList.insert(3, 3);
String normalListOrder = "123";
assertEquals("Check reverseList, reversing a list with 3 elements.", normalListOrder, myList.reverseList());
}
我的问题是:我不相信我通过使用这种附加节点的每个数据然后返回它的方法来正确测试我的reverseList方法,因为我并没有真正检查它是否被反转。此外,看起来需要更多的计算资源来完成所有这些工作。而且我认为在执行结束时返回 true 也是不够的。那么,我应该根本不测试它吗?有没有更好的方法来进行测试?
答:谢谢大家。我遵循了 Pelocho 的建议并覆盖了equals方法并更改了我的testReverseList和reverseList方法。我还创建了testEquals方法来检查实现的等于。看来这是我想要的最佳方法。所有测试都没问题。
public LinkedList reverseList() {
Node prev = null, current = head, next;
while (current != null) {
next = current.getNext();
current.setNext(prev);
prev = current;
current = next;
}
head = prev;
return this;
}
public boolean equals(LinkedList myList) {
if (myList == this) {
return true;
}
if (!(myList.getListSize() == this.getListSize())) {
return false;
}
// Starts at 1 because retrieveNode pick the position, not index
for (int i = 1; i != this.getListSize(); i++) {
if (myList.retrieveNode(i).getData() != this.retrieveNode(i).getData()) {
return false;
}
}
return true;
}
@Test
public void testReverseList() {
LinkedList myList = new LinkedList();
myList.insert(1, 1);
LinkedList singleElementList = new LinkedList();
singleElementList.insert(1, 1);
assertEquals("Check reverseList, reversing a list with 1 element.", true, myList.reverseList().equals(singleElementList));
LinkedList expectedList = new LinkedList();
myList.insert(2, 2);
myList.insert(3, 3);
expectedList.insert(3, 1);
expectedList.insert(2, 2);
expectedList.insert(1, 3);
assertEquals("Check reverseList, reversing a list with 3 elements.", true, myList.reverseList().equals(expectedList));
}
public void testEquals() {
LinkedList myList = new LinkedList();
myList.insert(1, 1);
assertEquals("Check reverseList, comparing to the same list.", true, myList.reverseList().equals(myList));
LinkedList myList2 = new LinkedList();
myList2.insert(1, 1);
myList2.insert(2, 2);
assertEquals("Check reverseList, different size list.", false, myList.reverseList().equals(myList2));
}
我开始建议在反转时返回一个新LinkedList
。但这只是为了不变性
无论如何,你想测试你的方法,对吧?
现在,您正在更改状态并返回当前状态的表示形式,只是为了进行测试。请注意,仅仅为了能够执行测试而修改生产代码通常不是一个好的做法。您正在修改其内部状态,因此您需要检查
@Test
public void testReverseList() {
LinkedList someList = new LinkedList();
myList.insert(1, 1);
myList.insert(2, 2);
myList.insert(3, 3);
LinkedList expectedList = new LinkedList();
// You'll probably want to check these lines in order to ensure I'm using it the right way
expectedList.insert(3, 1);
expectedList.insert(2, 2);
expectedList.insert(1, 3);
for (int i = 0; i < expectedList.size(); i++)
assertEquals("Checking item with index " + i, myList.get(i), expectedList.get(i));
assertEquals(myList.size(), expectedList.size());
// Or even better, implement LinkedList.equals() so you can use
assertEquals("Check reverseList", myList, expectedList);
}
通过使用toString()
执行检查,您在其实现中传递了太多内容。假设您有一个对象,其toString()
方法返回一个随机字符串(我不确定为什么这可能有用,但让我们假设一分钟(。assertEquals(myObject.toString(), myObject.toString())
可能会失败,但assertEquals(myObject, myObject)
不会
我可以建议以下更改:
将列表反转与"toString"表示形式分开,并分别调用这些方法。
然后,确保您正在测试正确的结果(您想要"321",对吧?
public LinkedList reverseList() {
Node prev = null, current = head, next;
while (current != null) {
next = current.getNext();
current.setNext(prev);
prev = current;
current = next;
}
head = current;
return this;
}
public String toString() {
StringBuilder checkList = new StringBuilder();
Node current = head;
while (current != null) {
checkList.append(current.getData());
current = current.getNext();
}
return checkList.toString();
}
@Test
public void testReverseList() {
LinkedList myList = new LinkedList();
myList.insert(1, 1);
myList.insert(2, 2);
myList.insert(3, 3);
String reverseListOrder = "321";
assertEquals("Check reverseList, reversing a list with 3 elements.", reverseListOrder, myList.reverseList().toString());
}
很难理解你的代码。如果您需要代码审查,我可以首先告诉您永远不要使用与API(LinkedList(中相同的类名。然后创建一个单独的类并使用 junit 进行测试。您的测试失败?您正在比较"123"和应该是"321"的东西,不?为什么你的列表有一个插入键值对的方法?