2013-03-23 32 views
5

Tôi cố gắng để viết bài kiểm tra đơn vị cho một lớp BinarySearchTree Các keys() trả về một Iterable Nó sử dụng một lớp được gọi là Queue trong đó các phím được xếp hàng và trở về ..junit bình đẳng thử nghiệm của một Iterable

Các Queue (lớp bên thứ ba) tuy nhiên không có bất kỳ bằng() được xác định.

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

cố gắng để viết đơn vị kiểm tra

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

này không

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) 

Tôi có phải thực hiện một equals() trong lớp bên thứ ba hoặc là có cách nào khác để làm điều này để kiểm tra bình đẳng? Tất cả tôi có thể nghĩ ra được chạy một vòng lặp dequeueing từ hàng đợi q và so sánh nó với những gì returned.I iterator không chắc chắn nếu có một cách tốt hơn .. Xin cho biết ..

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

[So sánh hai bộ sưu tập trong Java] (http://stackoverflow.com/questions/4085353/comparing-two-collections-in-java) –

Trả lời

0

bạn có thể sử dụng tiện ích class java.util.Arrays. Từ những gì tôi nhớ giao diện Hàng đợi có phương thức toArray. Vì vậy, nó sẽ là một cái gì đó như thế này:

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

Vì nó là một thư viện của bên thứ ba, bạn có thể sử dụng commons apache:

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

không may, Queue này (http: //algs4.cs. princeton.edu/13stacks/Queue.java.html) là một lớp của bên thứ ba và không có phương thức toArray() – damon

+0

Ok. Tôi bỏ lỡ điều đó. Có lẽ nếu bạn có apache commons về dự án: IteratorUtils.toArray (iterator) –

3

Sử dụng hamcrest của Matchers.contains (mô tả here). Ví dụ:

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

Điều này sẽ kiểm tra các yếu tố mà Iterable trả về mà không cần thực hiện bình đẳng trên lớp xếp hàng của bạn.

0

Đây là cách tôi đã thực hiện việc này.

Tôi đã chuyển đổi Iterable thành ArrayList. Sau đó, tôi đã tạo một danh sách các giá trị khóa dự kiến ​​khác. Bằng cách đó tôi có thể kiểm tra nếu hai arrayLists bằng nhau bằng cách sử dụng assertEquals (arrayList1, arrayList2). Đây là mã tôi đã viết để thử nghiệm phương thức truyền tải preOrder của tôi.

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

    } 

    } 
Các vấn đề liên quan