0

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

4 回答 4

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

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

于 2012-04-28T01:29:07.977 回答
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());

    }
}

注意:您应该只在测试中创建一个实例。确保您的队列有一个具体类型的东西要保存(在这种情况下为字符串)。

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

于 2012-04-28T01:27:27.230 回答
0

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

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

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

于 2012-04-28T01:56:58.550 回答
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);
  }

}

如果您想非常严格,您可能应该在两个单独的测试方法中测试每个队列最初是空的以及异常。

于 2012-04-28T22:54:39.923 回答