2012-04-28 52 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); 
    } 

} 

如果你想成爲非常嚴格,你也許應該測試每個隊列最初都是空的,並且是兩個獨立測試方法中的例外。