Java 如何使用JUnit对链表进行单元测试

Java 如何使用JUnit对链表进行单元测试,java,junit,tdd,Java,Junit,Tdd,我是TDD的忠实粉丝,我通常在编写代码之前为我的大学作业编写测试用例。这是我任务的界面: public interface SinglyLinkedList<E> { public void insertFirst(E e); public void insertAfter(E e, int index); public void removeFirst(); public void remove(int index); public void

我是TDD的忠实粉丝,我通常在编写代码之前为我的大学作业编写测试用例。这是我任务的界面:

public interface SinglyLinkedList<E> {
    public void insertFirst(E e);
    public void insertAfter(E e, int index);
    public void removeFirst();
    public void remove(int index);
    public void removeAll();
    public E getFirst();
    public E get(int index);
    public int size();
    public String toString();
}
公共接口单链接列表{
首次公开无效插入(E);
公共无效插入符(E,int索引);
公共无效删除优先();
删除公共空间(int索引);
公共无效删除所有();
公共E getFirst();
公共E-get(int-index);
公共整数大小();
公共字符串toString();
}
我写了整个测试用例,但感觉好像我写了糟糕的测试代码。我找不到编写测试方法的方法。我无法找到一种不使用size()测试remove()的方法。或者我找不到一种方法来测试insertFirst(),而不在后面调用get()。 据我所知,没有办法标记testmethods依赖项,对吗?我有没有办法用嘲弄来解决这个问题?
或者您将如何处理这个问题?

单元测试中的单元不必是单独的方法。从不同的角度思考更有用。契约可以是给定某些参数,函数应该返回某个值,但它们通常更复杂

例如,可能有一个约定,在调用
insertFirst
之后:

  • getFirst
    返回插入的对象
  • size
    返回旧尺寸加1
  • toString
    的输出包括插入的对象
这些将被称为合同的后条件。合同也可能有先决条件:例如,如果列表为空,则
remove
应引发异常


当契约需要与外部实体交互时,模拟对象就变得很有用。这里的情况并非如此。

我认为在测试remove()的方法中使用size()没有错:remove()契约的一部分是,如果要删除的对象在列表中,它必须减小大小,因此在调用remove()后检查大小是否正确是非常自然的。请注意,完整的TDD方法将从较小的开始,没有测试就没有编写整个接口。这样,您就可以构建并不用担心使用其他方法的方法,因为这些方法已经过测试并正在工作。信息隐藏的全部目的是将类限制为公共接口。测试只能确定此接口集体反映了对象的正确、一致状态。编写测试的任务是在不同的星座中,围绕作为测试用例“目标”的各个方法,找到一组(最少)这样做的调用。你能给我推荐一本书,在那里我可以找到更多关于这个合同概念的信息吗?我命令用junit在java中进行实用单元测试。你认为我能在那里找到细节吗?“实用程序员”有一章是关于合同设计的。这是一本相当不错的书,是我最喜欢的书之一