我想测试一下这个方法: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 :(得分:4)
Random不保证它不会两次返回相同的值...
所以你无法测试"see if it returns one of the elements more than once"
如果您需要,您必须在Set
周围实施Random
,但要注意生日悖论......
我认为你有两个选择:
1:您可以尝试为Random
播种,这样您就可以预测序列......
2:删除Random并使用[Collections.shuffle][1]
来重新排列arrayList
使用选项1,您将不得不更改方法的签名。
使用选项2,您还可以播放一首歌。
答案 1 :(得分: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.
...
}
答案 2 :(得分:2)
我在你的代码中看到了另一个问题:如果你想以随机顺序播放歌曲,你就是以错误的方式做到了。在播放列表中的所有歌曲之前,此算法不应重复播放歌曲。为了达到这个目的,有一种叫做Knuth shuffling的算法。您可以从Collections
班级java.util.Collections#shuffle
获取该作品。
答案 3 :(得分:0)
以下是一篇关于随机性测试的文章,您可能会发现它很有用:
http://beust.com/weblog/2012/02/20/various-ways-to-get-randomness-wrong/