Friday, May 21, 2010

[android-developers] JUnit Puzzle: How do I test a Service and an Application together?

I want to test a Service with my Application class pre-instantiated, a
bit like what happens on a real device.

My problem is I can't figure out a way to do this with the correct
Application context AND having the Application being instantiated
EXACTLY once. Being instantiated multiple times causes issues if
there is code which uses singletons, and/or performs registrations
tasks that should only be performed once.

Full code for this snippet can be downloaded here:
http://www.zedray.co.uk/temp/ServiceSnippet.zip

My test code:
=============================
public class ServiceDemoTest extends ServiceTestCase<ServiceDemo> {
protected final void setUp() throws Exception {
/** Setup the MainApplication. **/
mApplication = (ApplicationDemo)
Instrumentation.newApplication(ApplicationDemo.class, getContext());
mApplication.onCreate();
setApplication(mApplication);

super.setUp();
}

@Override
protected final void tearDown() throws Exception {
if (mApplication != null) {
mApplication.onTerminate();
mApplication = null;
}
setApplication(null);

super.tearDown();
}

@MediumTest
public final void testStartable() {
startService(new Intent(getContext(), ServiceDemo.class));
}
=============================

This produces the following trace, which suggests that several
instances of my Application are being created, or just that onCreate()
is being called several times:

=============================
05-21 16:20:43.667: INFO/ServiceSnippet(4126):
ApplicationDemo.onCreate() mInstanceId[0]
05-21 16:20:46.398: INFO/ServiceSnippet(4143):
ApplicationDemo.onCreate() mInstanceId[0]
05-21 16:20:46.437: INFO/ServiceSnippet(4143):
ApplicationDemo.onCreate() mInstanceId[1]
05-21 16:20:46.447: INFO/ServiceSnippet(4143): ServiceDemo.onCreate()
05-21 16:20:46.447: INFO/ServiceSnippet(4143): ServiceDemo.onStart()
05-21 16:20:46.466: INFO/ServiceSnippet(4143):
ApplicationDemo.onCreate() mInstanceId[2]
05-21 16:20:46.488: INFO/ServiceSnippet(4143):
ApplicationDemo.onCreate() mInstanceId[3]
=============================

I have no idea why the onCreate() keeps getting called, and how to
ensure it only happens once. Is this possible? Any ideas?

Regards
Mark

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

No comments:

Post a Comment