Android MediaPlayer OnCompletionListener未在JUnit Testcase(AndroidTestCase)中调用!

时间:2012-01-23 13:12:11

标签: android junit media-player

我正在使用Android MediaPlayer类并尝试编写一个测试用例来验证是否调用了onCompletion方法。 在上一首曲目结束后,我用它来播放下一曲目。

当我使用模拟器(2.1或4.0)运行应用程序时,会调用onCompletion方法并开始播放下一首曲目,但在测试用例中则不然。 这是简化的代码:

public class MediaPlayerControllerTest extends AndroidTestCase implements OnCompletionListener {

    public void testContinuePlayNextTrack() {
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnCompletionListener(this);
        try {
            mediaPlayer.setDataSource("/mnt/sdcard/5749/01.mp3");
            mediaPlayer.prepare();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mediaPlayer.start();
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        System.out.println("ON COMPLETION!!!!!");
    }
}

上面的代码通常是应用程序和测试中使用的MediPlayerController类的一部分,因此它是同一个类。我将问题分解为上面的几行代码。

这花了我很多时间。我希望有人有解决方案!

非常感谢!!!

3 个答案:

答案 0 :(得分:4)

我遇到过这个问题,没有什么对我有用。从MediaPlayer的官方网站(click me)可以找到以下句子:

  

为了接收与这些侦听器关联的相应回调,应用程序需要在运行自己的Looper的线程上创建MediaPlayer对象(默认情况下,主UI线程正在运行Looper)。

我有点失落,因为在onCompletionListener本身的API中没有提示这个需求。

答案 1 :(得分:2)

我认为问题是当MediaPlayer播放完mp3时你的测试用例不再运行了。因此,您的解决方案是保持测试用例处于活动状态,直到触发onCompletion()。

从IntentService播放文件时遇到了类似的问题。在回叫开始之前,该服务正在被销毁。

答案 2 :(得分:0)

实际上,原因是MediaPlayer是一个局部变量。 testContinuePlayNextTrack()完成后,GC收集MediaPlayer。因此修复很容易,使您的MediaPlayer成为该类的成员。

public class MediaPlayerControllerTest extends AndroidTestCase implements OnCompletionListener {
    MediaPlayer mediaPlayer = new MediaPlayer();

    public void testContinuePlayNextTrack() {
        mediaPlayer.setOnCompletionListener(this);
        try {
            mediaPlayer.setDataSource("/mnt/sdcard/5749/01.mp3");
            mediaPlayer.prepare();
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        mediaPlayer.start();
    }

    @Override
    public void onCompletion(MediaPlayer mp) {
        System.out.println("ON COMPLETION!!!!!");
    }

}