2014-04-04 52 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)。 –