2012-11-09 73 views
2

我想測試這種方法的方法:ArrayList<File> songs;測試產生隨機結果

public void playRandomSong() 
{ 
    Random random = new Random(); 
    int iNextSong = random.nextInt(songs.size()); 
    File songToPlay = songs.get(iNextSong); 
    if (mediaPlayer != null && mediaPlayer.isPlaying()) 
     mediaPlayer.stop(); 
    mediaPlayer = new MediaPlayerImpl(songToPlay, new WhenDone()); 
    mediaPlayer.play(); 
    currentSong = songToPlay; 
} 

我想以這樣的方式運行的方法多次,看看它是否返回的要素之一不止一次。但是,我會如何在代碼中編寫它?

+0

您確切的問題是什麼? – Heskja

+0

沒問題,該方法按原樣運行。但即時通訊編程相當新穎,現在我試圖學習單元測試。這就是爲什麼我想寫這個方法的測試。我的媒體播放器只播放每首歌曲一次。所以我的意思是,如果如果多次返回一個元素,那麼測試應該通過。這可能有可能嗎? – Henrik

回答

3

隨機不保證它不會返回相同的值的兩倍...... 所以你不能測試"see if it returns one of the elements more than once"

如果你需要,你將必須實現Random周圍Set,但要注意的生日悖論...

我覺得你有2種選擇:

1:你可以試試種子您Random,這樣你就可以預測序列...

2:刪除隨機並利用[Collections.shuffle][1]來洗牌arrayList

使用選項1,您將不得不更改方法的簽名。

隨着選項2,你也將播放每首歌曲一次。

+0

我的mediaplayer只播放一首歌。所以我的意思是,如果如果多次返回一個元素,那麼測試應該通過。這可能有可能嗎? – Henrik

+0

正如我所說,Random不能保證這一點,你將不得不這樣編程。 – Frank

2

我在你的代碼中看到另一個問題:如果你想以隨機順序播放歌曲,你是以錯誤的方式來播放歌曲。這個算法不應該重複歌曲,直到播放列表中的所有歌曲。爲了達到這個目的,有一種叫做Knuth混洗的算法。你可以從Collections類:java.util.Collections#shuffle

4

而不是在你的方法創建一個RNG

public void playRandomSong() { 
    Random random = new Random(); 
    ... 
} 

你應該通過隨機源中(這稱爲依賴注入

public void playRandomSong(Random random) { 
    ... 
} 

然後您可以在單元測試中生成帶有已知種子的Random實例,以獲得可重複但典型的結果。

public void testPlayRandomSong() { 
    Random random = new Random(0xd5021e90339050ab); 

    // Test that 1000 runs plays each song roughly the right number of times. 
    ... 
}