2012-04-28 2 views
0

новичок в программировании на Java, я просто пытаюсь понять, как я могу проверить этот класс. Я сделал класс Queue:Я запутался в этом тестовом примере 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); 

} 

} 

Я хочу сделать JUnit под названием QueueTest, которое автоматически сбрасывается опорожнить перед каждым испытанием, которое началось? Затем я хочу проверить, что удаление элемента из пустой очереди вызывает 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); 

} 

} 

Am Я близок к тому, что я пытаюсь достичь? Я пытаюсь сделать первый.

Благодарим вас за помощь и достаточно времени.

+0

Какая у вас проблема? Ваш тест не скомпилирован или запущен? – duffymo

+0

Не удается запустить. Наверное, потому что я не могу сделать это. Я логически не понимаю. – DesignAndCode

+0

Скомпилирует? Как вы пытаетесь запустить его? – duffymo

ответ

1

У вас все хорошо.

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

} 

Проблема в том, что вы создаете новый экземпляр очереди, но вы ничего с этим не делаете.

Тогда внутренности вашего теста могли быть

@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 
    } 
} 

Что это означает, что вы хотите сделать Queue («A»), а затем сразу же попытаться получить элемент («B»). Это должно вызвать исключение. Если это не так, ваш тест завершится неудачей с «ожидаемым исключением» («C»). Если ожидаемое исключение выбрасывается, вы создаете код ('D')

Я отправлю сообщение после того, как вы это заработаете.

+0

Это имеет большой смысл, спасибо за комментарии A, B, C и D. Он щелкнул. Еще раз спасибо Тони, ваше время было оценено. – DesignAndCode

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()); 

    } 
} 

Примечание: Вы должны просто создать экземпляр в тесте. Убедитесь, что ваша очередь имеет конкретный тип вещи для хранения (в этом случае строка).

Помните, какие дженерики делают для вас: они позволяют создавать коллекцию или контейнер, поведение которых не зависит от типа объектов, на которые он держится. Таким образом, у вас может быть очередь, содержащая строки или персонажи или пингвины.

+0

Я думаю, он хочет вызвать leave() для генерации исключения. –

+0

Думаю, он хочет научиться тестировать свой класс - все его методы. Это просто пример. И, если в классеpath нет класса E, у него будет проблема с вашим примером. – duffymo

+0

Его _leave() _ возвращает E. –

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); 
    } 

} 

Если вы хотите быть очень строгим, вероятно, вы должны проверить, что каждая очередь изначально пуста и исключение в двух отдельных методах тестирования.

Смежные вопросы