2013-01-15 48 views
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)是否按照正確的順序返回?如果樹爲空會發生什麼? etc

回答

1

它只是一個引用(基本上是一個指針),它被壓入堆棧。

另一種策略是將一個抽象的Stream對象傳遞給你的方法,並打印到該方法,而不是將其硬編碼到System.out。然後進行測試,您可以傳入一個mock object來捕獲輸出。

0

我想問題是,你的應用程序的主要目的是什麼,你想測試什麼?
事實上,你的代碼什麼都不做,只是打印出所有的節點,但我想這只是爲了讓示例更簡單。

我不會測試遍歷本身。這是一個給定的系統功能,你可以確定它能正常工作。而是測試你的結果。

+0

是的,這是我想要一個返回類型的原因,以便我可以檢查結果,而不是系統功能。 – samach

1

而不是打印到控制檯,您可以通過要使用的PrintStream。這可以是System.out或PrintStream包裝一個ByteArrayOutputStream,您可以將其轉換爲字符串以在方法運行後進行檢查。