Unit testing Activity.startService() call?

旧城冷巷雨未停 提交于 2019-11-28 03:13:38

问题


Attempting to write my first Android-by-TDD app (I've written a few small Android apps without TDD, so am familiar with the environment), but I can't seem to get my head around how to write my first test.

The scenario:

I have an activity, TasksActivity, and a service, TasksService. I need to test that TasksActivity starts TasksService in its onStart() method.

The test I've written is this:

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

In my onCreate() method in TasksActivity I have:

    startService(new Intent(this, TasksService.class));

I have also tried

    getBaseContext().startService(new Intent(this, TasksService.class));

But in neither case does my MockContext's startService method get called. Is there a way I can set up interception of this method? I'd really rather not have to start wrapping the basic Android APIs in order to perform such basic tests...


回答1:


Just to summarise the conversation with Brian Dupuis in comments, the problem was that MockContext doesn't provide facilities that are required by the test instrumentation in order to correctly call onCreate(). Switch from MockContext to ContextWrapper solved this problem.

The working test therefore looks like this:

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


来源:https://stackoverflow.com/questions/9294211/unit-testing-activity-startservice-call

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!