2013-03-23 9 views
5

Ich versuche, Unit-Tests für eine BinarySearchTree Klasse Die keys() gibt eine Iterable .Es verwendet eine andere Klasse Queue die Schlüssel in der genannten zu schreiben sind die Warteschlange gestellt und wieder ..junit Prüfung Gleichheit eines Iterable

die Warteschlange (Third Party Class) hat jedoch keine equals() definiert.

public class BinarySearchTree<Key extends Comparable<Key>,Value> { 
    Node root ; 

    private class Node{ 
     private Key key; 
     private Value val; 
     private Node left; 
     private Node right; 
     private int N; 
     public Node(Key k, Value v,int N) { 
      super(); 
      this.key = k; 
      this.val = v; 
      this.N = N; 
     } 
    } 

     public Iterable<Key> keys(){ 
      Queue<Key> q = new Queue<Key>(); 
      inOrder(root,q); 
      return q; 
     } 
     private void inOrder(Node x,Queue q){ 
      if(x == null)return; 
      inOrder(x.left,q); 
      q.enqueue(x.key); 
      inOrder(x.right,q); 
     } 
    ... 
} 

versucht, Unit-Test zu schreiben

@Test 
public void testKeys(){ 
    MyBST<String, Integer> st = new MyBST<String, Integer>(); 
    st.put("S",7); 
    st.put("E",2); 
    st.put("X",8); 

    st.put("A",3); 
    st.put("R",4); 

    st.put("C",1); 

    st.put("H",5); 
    st.put("M",6); 

    Queue<String> q = new Queue<String>(); 
    q.enqueue("A"); 
    q.enqueue("C"); 
    q.enqueue("E"); 
    q.enqueue("H"); 
    q.enqueue("M"); 
    q.enqueue("R"); 
    q.enqueue("S"); 
    q.enqueue("X"); 

    Iterable<String> actual = st.keys(); 
    assertEquals(q,actual); 
    } 

Dies scheitert

java.lang.AssertionError: expected: std.Queue<A C E H M R S X > but was: std.Queue<A C E H M R S X > 
    at org.junit.Assert.fail(Assert.java:93) 
    at org.junit.Assert.failNotEquals(Assert.java:647) 
    at org.junit.Assert.assertEquals(Assert.java:128) 
    at org.junit.Assert.assertEquals(Assert.java:147) 
    at week4.MyBSTTests.testKeys(BSTTests.java:304) 

Muss ich eine equals() in der Dritten Klasse implementieren oder gibt es eine andere Art und Weise zu tun um die Gleichheit zu prüfen? Alles, was ich von lief eine Schleife Warteschlangenauflösungs aus der Warteschlange q denken konnte und es mit dem, was der Iterator returned.I ist nicht sicher, ob es eine bessere Art und Weise .. Bitte geben ..

Iterable<String> actual = st.keys(); 
Iterator<String> actualit = actual.iterator(); 
while(actualit.hasNext()){ 
    String actualkey = actualit.next(); 
    String exp = q.dequeue(); 
    assertEquals(actualkey,exp); 
} 
+0

[Vergleich von zwei Sammlungen in Java] (http://stackoverflow.com/questions/4085353/comparing-two-collections-in-java) –

Antwort

0

Vergleichen Sie das Dienstprogramm verwenden können, Klasse java.util.Arrays. Soweit ich mich erinnere, verfügt die Warteschlangenschnittstelle über eine ToArray-Methode. So wäre es so etwas wie dieses:

assertTrue(Arrays.equals(queue1.toArray(),queue2.toArray())); 

Da es eine dritte Partei Bibliothek ist, könnten Sie Apache Commons verwenden:

Object[] o = IteratorUtils.toArray(queue1.iterator()); 
Object[] o2 = IteratorUtils.toArray(queue1.iterator()); 
assertTrue(Arrays.equals(o,o2)); 
+1

leider diese Queue (http: //algs4.cs. princeton.edu/13stacks/Queue.java.html) ist eine Klasse von Drittanbietern und hat keine toArray() Methode – damon

+0

Ok. Das habe ich vermisst. Vielleicht, wenn Sie Apache Commons für das Projekt haben: IteratorUtils.toArray (Iterator) –

3

Verwenden hamcrest der Matchers.contains (beschrieben here). Zum Beispiel:

assertThat(queue1.keys(), Matchers.contains("A", "C", "E", "H", "M", "R", "S", "X")); 

Dadurch werden die Elemente prüfen, ob die Iterable kehrt, ohne Gleichheit auf Ihrer Warteschlange Klasse implementiert.

0

So habe ich das gemacht.

Ich konvertierte das Iterable in die ArrayList. Dann machte ich eine andere Arraylist der erwarteten Schlüsselwerte. Auf diese Weise kann ich überprüfen, ob zwei arrayLists mit assertEquals (arrayList1, arrayList2) gleich sind. Hier ist der Code, den ich geschrieben habe, um meine PreOrder Traversal Methode zu testen.

import static org.junit.Assert.*; 
import java.util.ArrayList; 

import org.junit.Test; 

public class BSTTest 
{ 
    BST<Integer, String> binaryTree = new BST<Integer, String>(); 

    @Test 
    public void preOrdertest() 
    { 
     binaryTree.put(87, "Orange"); 
     binaryTree.put(77, "Black"); 
     binaryTree.put(81, "Green"); 
     binaryTree.put(89, "Blue"); 
     binaryTree.put(4, "Yellow"); 
     binaryTree.put(26, "white"); 
     binaryTree.put(23, "Purple"); 
     binaryTree.put(27, "Violet"); 
     binaryTree.put(57, "red"); 
     binaryTree.put(1, "crimson"); 

     ArrayList<Integer> testList = new ArrayList<>(); 

     testList.add(87); 
     testList.add(77); 
     testList.add(4); 
     testList.add(1); 
     testList.add(26); 
     testList.add(23); 
     testList.add(27); 
     testList.add(57); 
     testList.add(81); 
     testList.add(89); 

     Iterable<Integer> actual = binaryTree.preOrder(); 

     ArrayList<Integer> actualList = new ArrayList<>(); 

     if (actual != null) 
     { 
      for (Integer e : actual) 
      actualList.add(e); 
     } 

     assertEquals(testList, actualList); 

    } 

    } 
Verwandte Themen