Java 使用ArrayQueue的JUnit测试错误

Java 使用ArrayQueue的JUnit测试错误,java,junit,Java,Junit,我目前正在使用5个简单的方法(seek()、peek()、poll()、offer(item)、iterator()在ArrayQueue上进行一些JUnit测试。 我遇到的问题是当我运行此测试时 @Test public void testAddingToQueue() { for (int i = 1; i <= 20; i++) { assertTrue("Queue should successfully add item " + i

我目前正在使用5个简单的方法(seek()、peek()、poll()、offer(item)、iterator()在ArrayQueue上进行一些JUnit测试。 我遇到的问题是当我运行此测试时

@Test
public void testAddingToQueue() {       
    for (int i = 1; i <= 20; i++) {     
        assertTrue("Queue should successfully add item " + i, queue.offer("v" + i));       
        assertFalse("Queue should not be empty after add", queue.isEmpty());
        assertEquals("Size should be " + i + " after " + i + " adds", i, queue.size());
   }
}
我不明白队列是如何为空的,因为我正在
assertTrue
行中向队列添加字符串。。。任何帮助都将不胜感激

建造师

public ArrayQueue() {
    data = (E[]) new Object[INITIALCAPACITY];
}
添加方法

public boolean offer(E item) {
    if (item == null)return false;
    else {
        ensureCapacity();
        data[back] = item;
        back = (back+1);
        return true;
    }
}

您正在使用超类中的
isEmpty()
方法,但没有调用超类
add()
方法;超类不知道队列中已经添加了任何内容,但却被询问其内容

实际上,您在队列中有一个队列—这是一个混乱,因为您选择的超类有自己的存储实现,但您也在使用自己的存储实现,因此会产生混乱


如果您想构建自己的队列实现,请实现
queue

您的类扩展
AbstractQueue
,后者反过来扩展
AbstractCollection
。如果尚未提供自己的
isEmpty()
实现,则默认实现如下所示:

public boolean isEmpty() {
    return size() == 0;
}
我怀疑问题在于您的
size()
实现。您可以尝试颠倒代码中最后两个JUnit测试的顺序,以便在
isEmpty()
之前测试
size()
,以确定它是否(以及针对哪个索引)中断


无论如何,为基于数组的队列(如您正在构建的队列)提供了大量有用的信息和一些实现细节。

ArrayQueue
不是标准的Java类。我猜您的实现中有一个bug…基于您对方法的使用,我假设您的意思是
ArrayBlockingQueue
?没有ArrayQueue,这是我自己创建的一个简单的实现。在这种情况下,我们可以看到
提供的方法吗?还有,你如何构造/初始化队列?@eckes:好吧,我想如果OP给了我们他们的代码,那么他们班上的每个人都有它……
AbstractQueue
没有具体的实现细节。它没有一个
offer()
方法来调用…@thkala yes,但它有
add()
,如果您希望
isEmpty()
工作,则需要调用该方法。请记住,超类对您的代码没有任何可见性。我重复,
AbstractQueue
不包含任何实现细节。它根本没有状态。它依赖于子类为所有内容提供的方法,例如
add()
调用
offer()
…即。从
offer()
调用
add()。更不用说,任何使用
add()
而不是相反方式实现
offer()
的人都应该得到发生在他们身上的任何事情,包括(但不限于)被……伤害,谢谢你的帮助
public boolean isEmpty() {
    return size() == 0;
}