java - 如何将我的测试类转换为 JUnit 测试用例?

标签 java unit-testing junit

我得到了一个类,并被要求为初始类中的添加、删除、包含和迭代器方法编写一个测试程序。到目前为止,我已经使用简单的打印语句编写了测试程序,但希望将其转换为 JUnit 测试用例。我也在努力为迭代器编写测试方法。如何将目前为止所拥有的内容更改为 JUnit 测试用例格式并编写我的 testIterator 方法?

这是初始类:

import java.util.AbstractSet;
import java.util.Iterator;

public class BinarySearchTree<T> extends AbstractSet<T> {

private Node<T> root;
private int size;

private static class Node<T>
{
private T element;
private Node<T> left = null;
private Node<T> right = null;
private Node<T> parent;

private Node(T element, Node<T> parent)
{
    this.element = element;
    this.parent = parent;
}
}

public BinarySearchTree()
{
root = null;
size = 0;
}

public BinarySearchTree(BinarySearchTree<T> other)
{
root = null;
size = 0;
for (T element: other)
    add(element);
}

public int size()
{
return size;
}

public Iterator<T> iterator()
{
return new TreeIterator();
}




public boolean add(T element)
{
if (root == null) {
    root = new Node<T>(element, null);
    size++;
    return true;
} else {
    Node temp = root;
    int comp;
    while (true) {
    comp = ((Comparable)(element)).compareTo(temp.element);
    if (comp == 0)
        return false;
    if (comp<0) {
        if (temp.left != null)
        temp = temp.left;
        else {
        temp.left = new Node<T>(element, temp);
        size++;
        return true;
        }
    } else {
        if (temp.right != null)
        temp = temp.right;
        else {
        temp.right = new Node<T>(element, temp);
        size++;
        return true;
        }
    }
    }
}
}

public boolean remove(Object obj)
{
Node<T> e = getNode(obj);
if (e == null)
    return false;
deleteNode(e);
return true;
}

private Node<T> getNode(Object obj)
{
int comp;
Node<T> e = root;
while (e != null) {
    comp = ((Comparable)(obj)).compareTo(e.element);
    if (comp == 0)
    return e;
    else if (comp < 0)
    e = e.left;
    else
    e = e.right;
}
return null;
}

public T mapAdd(T obj)
{
if (root == null) {
    root = new Node<T>(obj, null);
    size++;
    return root.element;
}
int comp;
Node<T> e = root;
Node<T> p = null;
boolean left = true;
while (e != null) {
    p = e;
    comp = ((Comparable)(obj)).compareTo(e.element);
    if (comp == 0)
    return e.element;
    else if (comp < 0) {
    left = true;
    e = e.left;
    } else {
    e = e.right;
    left = false;
    }
}
e = new Node<T>(obj, p);
if (left)
    p.left = e;
else
    p.right = e;
size++;
return e.element;
}




public boolean contains(Object obj)
{
return getNode(obj) != null;
}

private Node<T> deleteNode(Node<T> p)
{
size--;
if (p.left != null && p.right != null) {
    Node<T> s = successor(p);
    p.element = s.element;
    p = s;
}

Node<T> replacement;
if (p.left != null)
    replacement = p.left;
else
    replacement = p.right;

if (replacement != null) {
    replacement.parent = p.parent;
    if (p.parent == null)
    root = replacement;
    else if (p == p.parent.left)
    p.parent.left = replacement;
    else
    p.parent.right = replacement;
} else if (p.parent == null) {
    root = null;
} else {
    if (p == p.parent.left)
    p.parent.left = null;
    else
    p.parent.right = null;
}
return p;
}

private Node<T> successor(Node<T> e)
{
if (e == null) {
    return null;
} else if (e.right != null) {
    Node<T> p = e.right;
    while (p.left != null)
    p = p.left;
    return p;
} else {
    Node<T> p = e.parent;
    Node<T> child = e;
    while (p != null && child == p.right) {
    child = p;
    p = p.parent;
    }
    return p;
}
}

private class TreeIterator implements Iterator<T>
{
private Node<T> lastReturned = null;
private Node<T> next;

private TreeIterator()
{
    next = root;
    if (next != null)
    while (next.left != null)
        next = next.left;
}

public boolean hasNext()
{
    return next != null;
}

public T next()
{
    if (next == null)
    throw new NoSuchElementException();
    lastReturned = next;
    next = successor(next);
    return lastReturned.element;
}

public void remove()
{
    if (lastReturned == null)
    throw new IllegalStateException();
    if (lastReturned.left != null && lastReturned.right != null)
    next = lastReturned;
    deleteNode(lastReturned);
    lastReturned = null;
}
}

}

这是我的测试程序:

import static org.junit.Assert.*;

import org.junit.Test;

public class TestTree {

    private void testAdd() {

        BinarySearchTree bst = new BinarySearchTree();

        bst.add(5);

        if (bst.contains(5)) {

            System.out.println("testAdd Failure");

        } else {

            System.out.println("testAdd Success");

        }

    }

    public void testRemove() {

        BinarySearchTree bst = new BinarySearchTree();

        for (int i=0; i < 5; i++) {
            bst.add(i);
        }

        bst.remove(3);

        if (bst.contains(3)) {

            System.out.println("testRemove Failure");

        } else {

            System.out.println("testAdd Success");

        }

    }

    public void testContains() {

        BinarySearchTree bst = new BinarySearchTree();

        for (int i=0; i < 5; i++) {
            bst.add(i);
        }

        bst.add(11);

        if (bst.contains(1) && bst.contains(2) && bst.contains(3) && bst.contains(4) && bst.contains(5) && 
                bst.contains(11)) {

            System.out.println("testContains Success");

        } else {

            System.out.println("testContains Failure");

        }

    }

    public void testIterator() {

        BinarySearchTree bst = new BinarySearchTree();

        for (int i=0; i < 10; i++) {

            bst.add(i);

        }

        bst.iterator();

    }

}

感谢您抽出时间,希望我说得有道理。

最佳答案

下面是一个示例,说明如果您使用 junit 及其断言方法,那么您的 restRemove 会是什么样子。

在每个测试方法前添加@Test。

@Test
public void testRemove() {

    BinarySearchTree bst = new BinarySearchTree();

    for (int i=0; i < 5; i++) {
        bst.add(i);
    }
    int elementThree = bst.get(3);
    bst.remove(3);

    assertFalse(bst.contains(elementThree));



}

关于java - 如何将我的测试类转换为 JUnit 测试用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36386651/

相关文章:

在 Ubuntu 上运行 Java 时间比在 Windows 上运行缩短 1 小时

c# - 断言被测系统应该抛出断言异常

java - 在 Jenkins 上构建时,单元测试没有重置上下文?

java - JUnit 规则临时文件夹

java - Java BMI计算器问题-英制或公制用户输入,错误处理,正确值输入,转换

java - Android XML规范化

python - 使用 Google App Engine 进行本地 Django 单元测试的 stub

java - 当消费者抛出异常时如何使 JUnit 测试失败?

java - 组织.hibernate.QueryException : duplicate association path for @ManyToOne Criteria

unit-testing - 如何测试setter和getter?