5

BinarySearchTreeクラスの単体テストを作成しようとしています。keys()戻り値.それは、キーがキューに入れられて返さIterableれる別のクラスを使用します..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);
}
4

3 に答える 3

3

Hamcrest を使用します (ここでMatchers.contains説明します)。例えば:

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

Iterableこれにより、キュー クラスに等価性を実装する必要なく、 が返す要素がチェックされます。

于 2013-03-23T04:54:48.430 に答える
1

ユーティリティ クラス java.util.Arrays を使用できます。私が覚えていることから、Queue インターフェイスには toArray メソッドがあります。したがって、次のようになります。

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

これはサードパーティのライブラリであるため、Apache Commons を使用できます。

Object[] o = IteratorUtils.toArray(queue1.iterator());
Object[] o2 = IteratorUtils.toArray(queue1.iterator());
assertTrue(Arrays.equals(o,o2));
于 2013-03-23T04:25:48.250 に答える
0

これが私がこれをした方法です。

Iterable を ArrayList に変換しました。次に、予想されるキー値の別の配列リストを作成しました。そうすれば、assertEquals(arrayList1, arrayList2) を使用して 2 つの arrayList が等しいかどうかを確認できます。preOrder トラバーサル メソッドをテストするために書いたコードを次に示します。

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

   }

  }
于 2014-10-19T00:58:29.557 に答える