2014-04-04 53 views
0

我有這個方法,它將搜索LinkedList(名爲ListNode)並檢查字符並檢查它們是否包含大寫字符,然後將其存儲在新鏈接列表中,然後返回該字符串。我爲它編寫了代碼,使用JUnit進行了測試,但是它失敗了JUNit(在那些藍色框中)。有誰知道出了什麼問題?LinkedList方法的JUnit測試失敗,爲什麼?

這裏是我的LinkedList方法:

public static ListNode copyUpperCase(ListNode head) { 
    ListNode newListNode = mkEmpty(); 
    if(head == null){ 
     throw new ListsException(""); 
    }else{  
     while(head.next != null){ 
      if(Character.isUpperCase(head.element)){ 
       newListNode.element = head.element;   
      } 
      head = head.next; 
     } 
    } 
    return newListNode; 
} 

這裏是ListNode:

public class ListNode { 
    public char element; 
    public ListNode next; 
} 

這裏是測試方法:

@Test 
public void testCopyUpperCase() 
{ 
    // Inject upper case letters randomly in the test strings. 
    // Assert equal results when extracting the upper case chars from 
    // the corresponding list, as wheen extracting them from the 
    // injected string itself. 
    for (String s : cases) { 
     String uppersAndLowers = randInjectUpper(s); 
     // Extract the upper case characters 
     StringBuilder uppers = new StringBuilder(); 
     for (int i = 0; i < uppersAndLowers.length(); i++) { 
      final char c = uppersAndLowers.charAt(i); 
      if (Character.isUpperCase(c)) 
       uppers.append(c); 
     } 
     ListNode temp = Lists.toList(uppersAndLowers); 
     ListNode lhs = Lists.copyUpperCase(temp); 
     assertFalse(hasSharedNodes(temp,lhs)); 
     ListNode rhs = Lists.toList(uppers.toString()); 
     assertTrue(Lists.equals(lhs,rhs)); 
    } 
} 

在TestMethod的失敗行是最後,它是:

assertTrue(Lists.equals(lhs,rhs));

這是什麼意思,如果它在該行失敗?

ps。這裏是equals方法也:

// Two lists are equal if both are empty, or if they have equal lengths 
// and contain pairwise equal elements at the same positions. 
public static boolean equals(ListNode l1,ListNode l2) { 
    if (isEmpty(l1) && isEmpty(l2)) 
     return true; 
    else if (isEmpty(l1) || isEmpty(l2)) 
     return false; 
    else { // both lists are non-empty 
     ListNode p1 = l1.next, p2 = l2.next; 
     while (p1 != null && p2 != null) { 
      char c1 = p1.element, c2 = p2.element; 
      if (p1.element != p2.element) 
       return false; 
      p1 = p1.next; 
      p2 = p2.next; 
     } 
     return p1 == null && p2 == null; 
    } 
} 

編輯:這是新方法:

public static ListNode copyUpperCase(ListNode head) { 

    ListNode newListNode = mkEmpty(); 
    if(head == null){ 
     throw new ListsException("Lists: null passed to copyUpperCase"); 
    }else{ 
     String cpy = toString(head); 
     char[] chry = cpy.toCharArray(); 
     for(int i = 0; i < chry.length ; i++) 
       if(Character.isUpperCase(chry[i])){ 
        newListNode.element = chry[i];  
       } 
       newListNode = newListNode.next; 
     }   
    return newListNode; 
} 
+0

我認爲while循環copyUpperCase如果沒有到最後一個項目複製到其他目錄。 –

回答

1

你的等號方法似乎沒問題。它能夠正確地檢查兩個列表是否都是空的,然後正確地檢查一個是否爲空,另一個不是。之後,您同時迭代兩個列表,檢查每個字符,最後,您希望兩個指針都爲空。一切還好。

所以問題必須在toList方法或copyUppercase方法。確實你的方法是越野車。問問自己,只有一個元素的列表會發生什麼?之後問問自己,所提供的列表中最後一個元素會發生什麼?你能看到現場嗎?

while循環條件是錯誤的:它必須僅僅是

while (head != null) { ... } 
+0

問題必須在copyUppercase中。 toList方法由教授提供,copyUppercase是即時編寫的方法。我像你說的那樣改變了while循環,但在測試時我仍然失敗。我很困惑,我不知道我該怎麼做。 – UserFuser

+0

我現在也看到了,你不檢查equals方法內的列表的第一個元素。這也是一個錯誤(但不涉及你目前的問題)。你應該寫一個打印方法來打印出所有列表元素。然後在調用seert方法之前使用這種打印方法。你可以看到,這個斷言是否正確。另外,你應該學習如何調試。 – Seelenvirtuose

+0

我改變了一點代碼,我已經有了打印所有元素的方法,但是作爲一個字符串。檢查我編輯過的帖子,我會把新方法放在底部。 @seelenvirtuose – UserFuser

0

這意味着,LHS不等於RHS,根據Lists.equals

實施

錯誤似乎是您的copyUpperCase只返回參數中給出的列表中的單個元素,或者您的測試代碼將字符串中的所有大寫字符添加到rhs(取決於您的意圖)。但是你可能在你的Lists.Equal方法中沒有顯示錯誤。

PS。我建議你不要在你的JUnit測試中放入隨機元素,因爲這意味着結果是不可重複的。

+0

我已經在我的帖子中提供了equals方法,請看看它,看看問題是否存在。 – UserFuser

+0

equals方法不檢查列表中的第一個元素是否相同,但是看起來不錯,我在這裏對你的其他代碼做了一些假設。我建議你瞭解如何使用[debugger](http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jdb.html)和[打印診斷輸出](http:// stackoverflow.com/questions/4005378/console-writeline-and-system-out-println)。 –