我对这个JUnit测试用例很困惑

时间:2012-04-28 01:01:18

标签: java junit

Java编程的新手,我只是想了解如何让这个类进行测试。我做了一个队列课程:

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

}

}

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

感谢您的帮助和充足的时间。

4 个答案:

答案 0 :(得分: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')

一旦你开始工作,我会发布更多信息。

答案 1 :(得分: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)。

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

答案 2 :(得分:0)

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

对于asserts他们通常采取的是要测试的东西,IE Q == 0,他们会选择一条可选的消息,如果测试失败,将会打印出来。

通过调查assertEquals的价值,您可以看到q失败的原因。

答案 3 :(得分: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);
  }

}

如果你想要非常严格,你应该测试每个队列最初是空的,并且在两个单独的测试方法中测试异常。