单元测试Activity.startService()调用?

Jul*_*les 9 tdd junit android unit-testing android-service

试图编写我的第一个Android-by-TDD应用程序(我已经编写了一些没有TDD的小型Android应用程序,因此熟悉环境),但我似乎无法理解如何编写我的第一个测试.

场景:

我有一个活动,TasksActivity和一个服务,TasksService.我需要测试TasksActivity在其onStart()方法中启动TasksService.

我写的测试是这样的:

public class ServiceControlTest extends ActivityUnitTestCase<TasksActivity>{
public ServiceControlTest() {
    super(TasksActivity.class);
}

public void testStartServiceOnInit () {
    final AtomicBoolean serviceStarted = new AtomicBoolean(false);
    setActivityContext(new MockContext() {
        @Override
        public ComponentName startService(Intent service) {
            Log.v("mockcontext", "Start service: " + service.toUri(0));
            if (service.getComponent().getClassName().equals (TasksService.class.getName()))
                serviceStarted.set(true);
            return service.getComponent();
        }
    });
    startActivity(new Intent(), null, null);
    assertTrue ("Service should have been started", serviceStarted.get());
}           
}
Run Code Online (Sandbox Code Playgroud)

在TasksActivity中的onCreate()方法中,我有:

    startService(new Intent(this, TasksService.class));
Run Code Online (Sandbox Code Playgroud)

我也试过了

    getBaseContext().startService(new Intent(this, TasksService.class));
Run Code Online (Sandbox Code Playgroud)

但在这两种情况下都不会调用我的MockContext的startService方法.有没有办法设置拦截这种方法?我真的不必开始包装基本的Android API以执行这样的基本测试......

Jul*_*les 6

仅仅是为了总结与Brian Dupuis在评论中的对话,问题是MockContext不提供测试仪器所需的设施以便正确调用onCreate().切换MockContextContextWrapper解决了这个问题.

因此工作测试如下:

public void testStartServiceOnInit () {
    final AtomicBoolean serviceStarted = new AtomicBoolean(false);
    setActivityContext(new ContextWrapper(getInstrumentation().getTargetContext()) {
        @Override
        public ComponentName startService(Intent service) {
            Log.v("mockcontext", "Start service: " + service.toUri(0));
            if (service.getComponent().getClassName().equals ("net.meridiandigital.tasks.TasksService"))
                serviceStarted.set(true);
            return service.getComponent();
        }
    });
    startActivity(new Intent(), null, null);
    assertTrue ("Service should have been started", serviceStarted.get());
}
Run Code Online (Sandbox Code Playgroud)