2017-07-26 29 views
1

我正在Java中實現單向鏈接列表。我創建了一個名爲reverseList方法,反轉我的列表,例如:使用JUnit測試反轉單個鏈接列表的方法

頭 - > 1 - > 2 - > 3 - >空
變爲:
頭 - > 3 - > 2 - > 1 - >空

我還創建了一個測試類(使用JUnit),其具有稱爲testReverseList方法,其測試reverseList方法。 插入方法獲取數據以及您想要添加新節點的位置。所有這三種方法似乎都能正常工作。

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的建議並覆蓋了等於方法並更改了我的testReverseListreverseList方法。我還創建了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)); 
} 
+2

我想你的問題是[codereview](https://codereview.stackexchange.com)。 – Sergii

+1

您的斷言正在驗證您**沒有**反轉列表。例如。你聲明'reverseList()'方法返回的順序仍然是原來的順序...... –

回答

0

我開始建議在倒轉時返回一個新的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()你中繼在其實施太多的檢查內容。假設你有一個Object,它的toString()方法返回一個隨機的String(我不確定爲什麼這可能有用,但我們假設這是一分鐘)。 assertEquals(myObject.toString(), myObject.toString())可能會失敗,但assertEquals(myObject, myObject)不會

0

這是很難理解你的代碼。如果您需要代碼審查,我可以先告訴您從不使用與API(LinkedList)中類名相同的類名。然後製作一個單獨的課程並使用junit進行測試。你的測試失敗了?你在比較「123」和「321」是什麼?爲什麼你的列表有一個插入一個鍵值對的方法?

1

我可以建議如下修改:

單獨從「的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());  
} 
+1

你可能想添加@Test註解 - 他問JUnit,所以它可能是值得的提到一個JUNIT測試將被分開,看起來有點不同! – GhostCat