java – junit测试Iterable的相等性

前端之家收集整理的这篇文章主要介绍了java – junit测试Iterable的相等性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试为BinarySearchTree类编写单元测试
keys()返回一个Iterable.It使用另一个名为Queue的类,其中键被入队并返回.

但是Queue(第三方类)没有定义任何equals().

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

试图编写单元测试

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

这失败了

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)

我是否必须在第三方类中实现equals(),还是有其他方法来检查相等性?我能想到的只是从队列q中运行一个循环,并将它与迭代器返回的内容进行比较.我不确定是否有更好的方法..请指教..

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

解决方法

使用Hamcrest的Matchers.contains(描述 here).例如:
assertThat(queue1.keys(),Matchers.contains("A","C","E","H","M","R","S","X"));

这将检查Iterable返回的元素,而不需要在队列类上实现相等.

猜你在找的Java相关文章