2016-04-03 179 views
0

我被给了一个类,并被要求为初始类中的add,remove,contains和iterator方法编写一个测试程序。到目前为止,我已经使用简单的打印语句编写了测试程序,但希望将其转换为JUnit测试用例。我也在努力为迭代器编写我的测试方法。我如何将迄今为止我所拥有的功能更改为JUnit测试用例格式,并编写我的testIterator方法?如何将我的测试类转换为JUnit测试用例?

这是初始类:

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

    } 

} 

感谢您的时间,我希望我是有道理的。

+3

只需将'@ Test'注释添加到您的方法。 – Tunaki

回答

1

下面是一个示例,说明如果您使用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)); 



}