0

わかりました私はこのコードを持っています:

public void TraverseTree(TreeNode node) {

            TraverseTree(node.getLeftChild());
            System.out.println(node.getKey());
            TraverseTree(node.getRightChild());         
    }

これは実際にツリーのノードをトラバースし、それらを出力します。テスト ケースを書こうとしていたときに、戻り値の型のない関数を単体テストするにはどうすればよいかということに気付きました。

「単体テスト」に値するようにコードを変更すると、次のようになります。

public ArrayList<Object> TraverseTree(TreeNode node, ArrayList<Object> array) {

                if(array == null)
                      array = new ArrayList<Object>();
                traverseTree(node.getLeftChild(), array);
                array.add(node.getKey())
                traverseTree(node.getRightChild(), array); 

return array;       
        }

今私は考えています、これはこれを行う正しい方法ですか?再帰呼び出しごとに ArrayList オブジェクトがスタックにプッシュされるという事実はどうですか? これは良いアプローチですか?ツリーに何千ものキーが含まれている場合はどうなりますか?

これを行うためのより良い方法はありますか?最初のコード サンプル (何も返さないコード サンプル) を単体テストすることは可能ですか? 私のテストケースは単純です1)正しい順序で返されますか?ツリーが null の場合はどうなりますか? 等

4

3 に答える 3

1

スタックにプッシュされるのは、参照(基本的にはポインター)のみです。

別の戦略は、抽象Streamオブジェクトをメソッドに渡し、にハードコーディングするのではなく、それに出力させることSystem.outです。次に、テストのために、出力をキャプチャするためのモックオブジェクトを渡すことができます。

于 2013-01-15T16:48:32.510 に答える
1

コンソールに出力する代わりに、使用したい PrintStream を渡すことができます。これはSystem.out、メソッドの実行後に確認するために String に変換できる ByteArrayOutputStream をラップする PrintStream にすることもできます。

于 2013-01-15T16:54:40.553 に答える
0

質問は、アプリケーションの主な目的は何ですか?何をテストしたいのですか?
そのままでは、コードはすべてのノードを出力するだけですが、これは単に例を単純にするためだと思います。

トラバース自体はテストしません。これは特定のシステム関数であり、正しく動作することを確認できます。代わりに、トラバージョンの結果をテストしてください。

于 2013-01-15T16:50:51.110 に答える