2013-05-13 44 views
2

我想測試下面的兩種方法,但因爲它基於隨機輸出我的轉到assertEquals()將無法​​正常工作。如何JUnit測試在Java中的任何輸出

我只是想測試,以確保方法正在產生某種輸出。有任何想法嗎?

新手程序員,感謝幫助。

public void compRandomChoice() { 
    double choice = (Math.random() * 100/100); 

    if (choice > 0 && choice <= 0.34) { 
     computer.setChoice(HandThrow.ROCK); 
    } else if (choice > 0.34 && choice <= 0.67) { 
     computer.setChoice(HandThrow.PAPER); 
    } else { 
     computer.setChoice(HandThrow.SCISSORS); 
    } 
} 


    public String gameWinner() { 
    String gameResult; 

    if (human.getChoice() == computer.getChoice()) { 
     gameResult = "ITS A TIE!"; 
    } else if (human.getChoice() == HandThrow.ROCK 
      && computer.getChoice() == HandThrow.SCISSORS 
      || human.getChoice() == HandThrow.PAPER 
      && computer.getChoice() == HandThrow.ROCK 
      || human.getChoice() == HandThrow.SCISSORS 
      && computer.getChoice() == HandThrow.PAPER) { 
     gameResult = "CONGRATS, YOU WIN!"; 
    } else { 
     gameResult = "COMPUTER WINS!"; 
    } 
    return gameResult; 

} 

回答

3

我建議改變compRandomChoice()功能在你的程序如下

public void compRandomChoice(double rand_no) { 
    double choice = (rand_no * 100/100); 

    if (choice > 0 && choice <= 0.34) { 
     computer.setChoice(HandThrow.ROCK); 
    } else if (choice > 0.34 && choice <= 0.67) { 
     computer.setChoice(HandThrow.PAPER); 
    } else { 
     computer.setChoice(HandThrow.SCISSORS); 
    } 
} 

然後,你可以在你的單元測試現在叫它爲compRandomChoice(Math.random()), 你可以硬編碼的輸入,例如compRandomChoice(0.5)並斷言結果如預期。

同樣,改變public String gameWinner()public String gameWinner(String human_choice, String computer_choice)

public String gameWinner(String human_choice, String computer_choice) { 
    String gameResult; 

    if (human_choice == computer_choice) { 
     gameResult = "ITS A TIE!"; 
    ....... 

在你的代碼,你可以調用函數爲gameWinner(human.getChoice(), computer.getChoice())。在您的單元測試中,您可以對輸入進行硬編碼(使用類似於前一個函數的方法),並根據您傳遞的參數斷言您會得到預期的結果。

+0

這個貌似給出的選擇最佳路線,但是這需要我做周圍的MVC概念基於我的代碼一些廣泛的重組,所以現在我使用的是assertNotNull,把工作做在緊要關頭。謝謝! – phamousphil 2013-05-14 03:23:58

0

我會提取越來越隨意走進一個包專用方法

double getRandomChoice() { 
    return (Math.random() * 100/100); 
} 

因此,在測試中,我可以重寫它

MyClass mc = new MyClass() { 
     @Override 
     double getRandomChoice() { 
      return 2.0; 
     } 
    }; 
2

你所發現的是,你要測試(斷言)您的代碼在給定某些輸入的情況下表現正確,但是在編寫代碼時無法輕鬆控制輸入問題。恭喜!你已經發現了(測試驅動開發的)優點之一。

解決方案是以一種更容易測試您關心的屬性的方式重構代碼。

您關心compRandomChoice函數的哪些屬性?也許它會產生一個均勻分佈在三個選擇中的輸出。要做到這一點,你可以想象寫一個簡短的測試,通過對compRandomChoice的許多調用進行迭代,並做一些簡單的分析(和大數定律),以顯示你在三分之一的時間內得到每一個選擇。

gameWinner功能如何?在那裏你想嘗試不同的輸入組合並確認確定了正確的贏家。算法的輸入是計算機和人的選擇。因此,爲了測試它,您必須能夠製造人機和計算機選擇並將其提供給算法。這通常是通過使用依賴注入完成的......它提供了你的算法在構造函數中依賴的對象或者作爲參數,而不是對它們進行硬編碼。例如,最簡單的做法是將選項傳遞給gameWinner函數,並讓它返回勝利者(例如,作爲一個枚舉):

enum Result { PLAYER1, PLAYER2, TIE } 
/** 
* Determine the game winner. 
* @param player1_choice 
* @param player2_choice 
* @return PLAYER1 . 
*/ 
public Result gameWinner(HandThrow player1_choice, HandThrow player2_choice) { 
    if (player1_choice.equals(player2_choice)) { return TIE } 
    ... 
} 

然後測試是很容易寫:

@Test 
public void paperBeatsRock() { 
    assertEquals(gameWinner(HandThrow.ROCK, HandThrow.PAPER), PLAYER2); 
} 

Writing Testable Code看看;它提供了很多關於如何做你想做的事情的提示。

+0

感謝您的鏈接!我將深入研究這一點。 – phamousphil 2013-05-14 15:23:23

0

我的需求和時間我找到了assertNotNull()測試方法,並使用它。

@Test 
public void testGameWinner() { 
    assertNotNull(testLogic.gameWinner());