java - 测试等待 VideoView 完成以开始新 Activity robolectric 3

标签 java android unit-testing robolectric

我必须测试包含视频的屏幕启动,当视频完成开始其他 Activity 时,视频持续时间为 11 秒。

我有以下测试类:

public class ScreenSplashTest {

  private ShadowActivity screenSplash;
  private ShadowVideoView videoView;

  @Before
  public void setUp(){
      ScreenSplash screenSplashActivity = Robolectric.buildActivity(ScreenSplash.class).create().get();
      screenSplash = Shadows.shadowOf(screenSplashActivity);
      VideoView videoViewWidget = (VideoView)screenSplash.findViewById(R.id.videoViewSplash);
      videoView = Shadows.shadowOf(videoViewWidget);
  }

  @Test
  public void activityStarts_VideoStartsToPlay() throws Exception{
      assertTrue(videoView.isPlaying());
  }
  @Test
  public void whenVideoFinish_StartsChooseTeamActivity() throws Exception{
      videoView.stopPlayback();
      Intent nextActivity = screenSplash.getNextStartedActivity();
      assertEquals(nextActivity.getComponent().getClassName(), ChooseTeamActivity.class.getName());
  }
}

这是我的 ScreenSplash Activity :

public class ScreenSplash extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen_splash);
        getSupportActionBar().hide();
        this.getWindow().getDecorView().setBackgroundColor(0xffffff);

        VideoView videoView = (VideoView) findViewById(R.id.videoViewSplash);

        Uri videoFile = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.splash);
        videoView.setVideoURI(videoFile);

        videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                Intent i = new Intent(getApplicationContext(), ChooseTeamActivity.class);
                startActivity(i);
            }
        });

        videoView.start();
    }
  }

问题是我如何为这段代码编写测试?

最佳答案

您可以从ShadowVideoView的getOnCompletionListener中获取MediaPlayer.OnCompletionListener,然后调用其onCompletion方法。您可以模拟 MediaPlayer 对象。 可能的代码 fragment :

     assertTrue(videoView.isPlaying());
     MediaPlayer.OnCompletionListener completionListener = videoView.getOnCompletionListener();
     completionListener.onCompletion(mock(MediaPlayer.class));
     Intent intent = screenSplash.getNextStartedActivity();
     assertNull(intent);
     assertEquals(ChooseTeamActivity.class.getName(), intent.getComponent().getClassName());

这种方法就能测试上面的代码了。如果您正在考虑实际完整播放视频,然后执行监听器代码,那么这种方法将不符合单元测试方法。我们测试书面代码的功能,而不是底层框架。 在这种情况下,您的测试代码应该测试有效的 URI,检查其是否正在播放以及监听器是否执行所需的操作。 通过 MediaPlayer 对象测试监听器也将是对底层 Android 代码的测试,而不仅仅是您的代码。

关于java - 测试等待 VideoView 完成以开始新 Activity robolectric 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31506205/

相关文章:

java - 如何将所有字符串、数字、图片值从另一个java类传递到另一个类?

java - 在Android中转换为缓冲区

android - 在 Android 模拟器中录制闪烁

python - 导入错误: No module named zlib; tox

java - 我应该为 java.nio.Files 创建包装器以进行单元测试吗?

Python 单元测试和测试发现

java - 如何使用 Exchangeratesapi.io 和 okhttp 更改汇率基础货币,并在微调器中选择所有基础货币?

java - java 中使用 void 方法的异步编程

java - 尝试在 Eclipse 中执行 boolean 方法时出错

java - 通过方法调用增加变量值