2013-04-26 121 views
-6

嗨即时尝试运行我的功能和测试它认为junit测试,但我不明白为什么我的junit测试失败。我确信我写的功能是有效的。这是作业,如果有人想知道。错误,而运行功能

这里是测试

@Test 
public void test4() { 
    lst1.removeAll(3); 
    assertEquals(8, lst1.size()); 
    assertEquals(false, lst1.contains(3)); 
    lst1.removeAll(6); 
    assertEquals(5, lst1.size()); 
    assertEquals(false, lst1.contains(6)); 
    lst1.removeAll(5); 
    assertEquals(3, lst1.size()); 
    lst1.removeAll(4); 
    assertEquals(2, lst1.size()); 
    lst1.removeAll(7); 
    assertEquals(1, lst1.size()); 
    lst1.removeAll(8); 
    assertEquals(0, lst1.size()); 
} 

这里是代码

public void removeAll(E x) { 
     first = first.next; 
     if (first.data == x) { 
      first = first.next; 
     } 
     Node curr = first; 
     Node fut = curr.next ; 
     while (fut!= null) { 
      if (fut.data == x) { 
       curr.next = fut.next;    
      } 
     curr=curr.next; 
     fut=fut.next; 
     } 
    assert check(); 
} 

设置的junit高达

public class MyListTest { 
    private MyList<Integer> lst0; 
    private MyList<Integer> lst1; 
    private Integer[] a; 
    @Before 
    public void setUp() throws Exception { 
     lst0 = new MyList<Integer>(); 

     a = new Integer[] {3,4,3,5,6,8,6,6,7,5}; 
     lst1 = new MyList<Integer>(); 
     for(Integer x: a) { 
      lst1.add(x); 
     } 
} 

尺寸方法

public int size() { 
    return sz; 
} 

主要方法

public class MyList<E extends Comparable< E>> implements Iterable<E> { 
    private Node first; 
    private int sz; 

    public MyList() { 
     first = null; 
     sz = 0; 
     assert check(); 
    } 
} 

检查方法

private boolean check() 
{ 
    if (first == null && sz != 0) return false; 
    if (sz == 0 && first != null) return false; 
    if (sz == 1 && (first == null || first.next != null)) return false; 
    if (sz > 1 && (first == null || first.next == null)) return false; 

    int count = 0; 
    Node p = first; 
    while(p != null) { 
     count++; 
     p = p.next; 
    } 

    if (count != sz) { 
     System.out.printf("count = %d, sz = %d\n", count, sz); 
     return false; 
    } 

    return true; 
} 
+3

哪里的错误消息? – creinig 2013-04-26 06:59:59

+1

什么是'第一'?你在哪里设置你在测试中使用的数据? – 2013-04-26 07:00:26

+0

at assert check();和lst1.removeAll(3);我不知道为什么。首先是链接列表中的第一个链接 – 2013-04-26 07:07:34

回答

0

如果你是完全卡住你可以考虑从头开始了与小但更安全的步骤再次走你的路。

开始用一个简单的测试:

@Test 
public void testConstruct() { 
    MyNewList<Integer> myNewList = new MyNewList<Integer>(); 
    assertNotNull(myNewList); 
    assertEquals(0, myNewList.size()); 
} 

写信MyNewList刚够代码通过测试 - 做想到结构复杂,最简单的解决方案会为现在足够 - 甚至return 0;size()是好的。

如果你的代码最终通过测试,你可以写一个又一个:

@Test 
public void testAdd() { 
    MyNewList<Integer> myNewList = new MyNewList<Integer>(); 
    myNewList.add(5); 
    assertEquals(1, myNewList.size()); 
} 

再次实现足够的代码通过测试。一旦你成功地改变了测试,以检查你的解决方案还与其他参数的工作原理:

@Test 
public void testAdd() { 
    MyNewList<Integer> myNewList = new MyNewList<Integer>(); 
    myNewList.add(5); 
    assertEquals(1, myNewList.size()); 
    myNewList.add(7); 
    assertEquals(2, myNewList.size()); 
} 

现在你可以相信你的add()方法,并决定下一步该怎么做:取一个短暂的休息和清理您的代码或组织你上课的内部结构,还是前进到你旅程的下一个目的地?

当你最终去你必须解决的下一个谜题:

@Test 
public void testRemoveAll() { 
    MyNewList<Integer> myNewList = new MyNewList<Integer>(); 
    myNewList.add(5); 
    myNewList.add(5); 
    myNewList.add(7); 
    myNewList.add(3); 

    assertEquals(4, myNewList.size()); 
    myNewList.removeAll(3); 
    assertEquals(3, myNewList.size()); 
} 

现在再次编写足够的代码通过所有测试。现在你甚至可以实现你的方法是这样的:

public void removeAll(T element) { 
    size--; 
} 

这将是可能,因为它完全满足上面的测试说明的要求。现在让我们面对你的方法更强硬的检查和修改测试:

@Test 
public void testRemoveAll() { 
    MyNewList<Integer> myNewList = new MyNewList<Integer>(); 
    myNewList.add(5); 
    myNewList.add(5); 
    myNewList.add(7); 
    myNewList.add(3); 

    assertEquals(4, myNewList.size()); 
    myNewList.removeAll(3); 
    assertEquals(3, myNewList.size()); 
    myNewList.removeAll(5); 
    assertEquals(1, myNewList.size()); 
} 

如果你选择了一个简单的解决方案前,你可能是“麻烦”现在;)所以,再一次想想你removeAll()方法,并延长其代码直到它再次通过测试。 一旦你完成这个工作,你可以放心,你的代码作品。

如果您在课堂上改变了某些内容,请再次运行测试以查看是否有问题。

如果您对方法工作方式的要求发生变化 - 更改测试以反映新的要求并再次运行它们。

乍一看,这似乎很繁琐,但是一旦你的设置,你总是可以说测试了坚实的基金会:“我的代码工作究竟应该如何”