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...
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());
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With