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;
}

我是这样想的:多次运行该方法,看看它是否多次返回其中一个元素。但是我将如何在代码中编写它?

4

4 回答 4

4

随机不保证不会两次返回相同的值...所以不能测试"see if it returns one of the elements more than once"

如果你需要,你将不得不在Set周围实现Random,但要注意生日悖论......

我认为你有两个选择:

1:你可以尝试播种你的Random,所以你可以预测序列......

2:删除 Random 并使用[Collections.shuffle][1]shuffle 你的 arrayList

使用选项 1,您将不得不更改方法的签名。

使用选项 2,您还将播放每首歌曲一次。

于 2012-11-09T20:34:37.700 回答
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.
  ...
}
于 2012-11-10T06:40:43.460 回答
2

我在您的代码中看到另一个问题:如果您想以随机顺序播放歌曲,那么您这样做的方式是错误的。在播放列表中的所有歌曲之前,此算法不应重复歌曲。为了实现这一点,有一种称为 Knuth shuffle 的算法。Collections你可以从课堂上拿它: java.util.Collections#shuffle

于 2012-11-09T21:06:26.433 回答
0

这是一篇关于随机性测试的文章,您可能会发现它很有用:

http://beust.com/weblog/2012/02/20/various-ways-to-get-randomness-wrong/

于 2012-11-10T06:36:53.257 回答