测试产生随机结果的方法

时间:2012-11-09 20:25:04

标签: java random junit

我想测试一下这个方法: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;
}

我正在考虑这样:多次运行该方法,看看它是否多次返回其中一个元素。但是我怎么在代码中写出来呢?

4 个答案:

答案 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/