我正在尝试为BinarySearchTree类编写单元测试
keys()返回一个Iterable.It使用另一个名为Queue的类,其中键被入队并返回.
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返回的元素,而不需要在队列类上实现相等.