2012-04-28 80 views
0

新的Java编程,我只是想了解如何让这个类可以被测试。我做了一个队列类:我对这个JUnit测试用例感到困惑

public class Queue<E> { 

private ArrayList<E> items; 

public Queue(){ 
    items = new ArrayList<E>(); 
} 

public void join(E e) { 
    items.add(e); 
} 

public E leave() throws EmptyQueueError { 
    if (items.isEmpty()) { 
     throw new EmptyQueueError(); 
    } 
    return items.remove(0); 

} 

} 

我想创建一个名为QueueTest的JUnit是自动复位即开始每次测试之前清空?然后我想检查从空队列中移除一个项目是否会抛出EmptyQueueError?最后,我希望它能检查当几个项目加入一个(最初)空的队列时,它是第一个加入的是第一个离开的项目?

这是我正在遵循的教程,但它没有让我明白。我已经做了上面的课程,并且我尝试了JTest类:

package queue; 

public class QueueTest<e> { 

private Queue q; 

@Before 
public void setUp() throws Exception { 
} 

@After 
public void tearDown() throws Exception { 
} 

@Test 
public void test() { 
    q = new Queue<e>(); 
    assertEquals("Empty Queue", 0, q); 

} 

} 

我接近我想要实现的目标吗?我正在尝试做第一个。

谢谢你的帮助和充足的时间。

+0

您遇到什么问题?您的测试是否无法编译或运行? – duffymo 2012-04-28 01:07:51

+0

无法运行。可能是因为我无法完成。我逻辑上不明白。 – DesignAndCode 2012-04-28 01:11:18

+0

它是否编译?你如何尝试运行它? – duffymo 2012-04-28 01:19:59

回答

1

你做得很好。

@Test 
public void test() { 
    q = new Queue<e>(); 
    assertEquals("Empty Queue", 0, q); 

} 

这样做的问题是您创建了一个新的Queue实例,但是您对此没有做任何事情。

然后测试的内脏可能是

@Test 
public void test() { 
    Queue<Integer> q = new Queue<Integer>();  // A 
    try { 
     Integer ignore = q.leave();  // B 
     fail("exception expected");    // C 
    } catch (EmptyQueueError ex) { 
     // implicit success      // D 
    } 
} 

这意味着,你会成为一个队列(“A”),然后立即设法弄一本项(“B”)。这应该会导致异常。如果没有,您的测试将以“期望异常”('C')失败。如果预期的异常被抛出,您的代码作品('D')

一旦你得到这个工作,我会发布更多。

+0

这很有意义,谢谢你评论A,B,C和D.它点击了。再次感谢托尼,你的时间非常感谢。 – DesignAndCode 2012-04-29 03:18:06

0

试试这个:他们跑我。你不远处。

package cruft; 

    import java.util.ArrayList; 

    public class Queue<E> { 

     private ArrayList<E> items; 

     public Queue(){ 
      items = new ArrayList<E>(); 
     } 

     public void join(E e) { 
      items.add(e); 
     } 

     public E leave() throws EmptyQueueError { 
      if (items.isEmpty()) { 
       throw new EmptyQueueError(); 
      } 
      return items.remove(0); 

     } 

     // Note: I added this. 
     public int size() { return this.items.size(); } 
    } 
} 

而这里的测试:

package cruft; 

import org.junit.Assert; 
import org.junit.Test; 

public class QueueTest { 
    @Test 
    public void test() { 
     Queue<String> q = new Queue<String>(); 
     Assert.assertEquals("queue should be empty", 0, q.size()); 

    } 
} 

注意:你应该只在测试中创建一个实例。确保你的队列有一个具体类型的东西(本例中为String)。

记住泛型为您做了什么:它们让您创建一个集合或容器,其行为不取决于它所保存的对象的类型。所以你可能有一个包含字符串或人员或企鹅的队列。

+0

我想他想调用leave()来产生异常。 – 2012-04-28 01:30:34

+0

我想他想学习如何测试他的班级 - 所有的方法。这只是一个例子。而且,除非班级路径中有一个E类,否则他会在你的例子中遇到问题。 – duffymo 2012-04-28 01:34:22

+0

他的_leave()_返回一个E. – 2012-04-28 01:42:39

0

那么你想在这里测试什么?当你做assertEquals("Empty Queue", 0, q)你在这里试图测试什么?队列是空的?

对于asserts他们通常需要测试的东西是IE Q == 0,并且它们会接收一个可选消息,如果测试失败,将会打印出该消息。

为什么你的assertEquals失败的缺陷是你可以通过调查q的价值来看到的。

0

这里是如何与TestNG做到这一点,展示了如何测试一个例外,以及如何队列中的每个测试方法之前复位:

public class QueueTest { 

    private Queue q = new Queue(); 

    @BeforeMethod 
    public void setUp() throws Exception { 
     q.reset(); 
    } 

    @Test(expectedExceptions = EmptyQueueError.class) 
    public void shouldThrowIfRemovingFromEmpty() { 
    assertTrue(q.isEmpty()); 
    q.remove(0); 
    } 

} 

如果你想成为非常严格,你也许应该测试每个队列最初都是空的,并且是两个独立测试方法中的例外。