2013-03-23 5 views
5

Sto cercando di scrivere unit test per una classe di BinarySearchTree Il keys() restituire un Iterable .Si utilizza un'altra classe denominata Queue in cui i tasti sono accodati e restituiti ..JUnit uguaglianza sperimentazione di un Iterable

The Queue (classe di terze parti) tuttavia non ha alcun uguale() definito.

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); 
     } 
    ... 
} 

cercando di scrivere unit test

@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); 
    } 

Questo non

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) 

Devo implementare un equals() nella classe terza parte o c'è qualche altro modo per farlo questo per controllare l'uguaglianza? Tutto quello che riuscivo a pensare era in esecuzione un ciclo dequeueing dalla coda q e confrontandolo con quello che i returned.I iteratore non sono sicuro se c'è un modo migliore .. Si prega di avvisare ..

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

[Confrontando due collezioni in Java] (http://stackoverflow.com/questions/4085353/comparing-two-collections-in-java) –

risposta

0

è possibile utilizzare l'utilità classe java.util.Arrays. Da quello che ricordo l'interfaccia della coda ha un metodo toArray. Quindi sarebbe qualcosa di simile:

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

Come è una libreria di terze parti, è possibile utilizzare comuni apache:

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

purtroppo, questa coda (http: //algs4.cs. princeton.edu/13stacks/Queue.java.html) è una classe di terze parti e non ha alcun metodo toArray() – damon

+0

Ok. Ho perso questo. Forse se hai commons apache sul progetto: IteratorUtils.toArray (iterator) –

3

Usa Hamcrest Matchers.contains (descritto here). Per esempio:

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

Questo controllerà gli elementi che le Iterable restituisce senza uguaglianza bisogno implementati sulla tua classe coda.

0

Ecco come ho fatto.

Ho convertito l'Iterable in ArrayList. Poi ho creato un altro arraylist di valori chiave attesi. In questo modo sono in grado di verificare se due liste di array sono uguali usando assertEquals (arrayList1, arrayList2). Ecco il codice che ho scritto per testare il mio metodo preOrder traversal.

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

    } 

    }