Service.startForeground () выдает исключение NullPointerException при запуске с ServiceTestCase

Это известный раздражающий двухлетний Android-глюк.

Мой вопрос: кто-нибудь знает об обходном пути для этой проблемы, помимо изменения исходного кода Android и его компиляции еще раз?

Вот мой код для завершения:

Мой подкласс класса, который повышает NPE:

/** Shows notification of started service */ private void doStartForeground() { // Prepare notification final NotificationHelper nh = doNotification("Service started"); // Start foreground startForeground(nh.getNotificationId(), nh.getNotification()); } 

Это вызывается из onCreate() метода onCreate() .

И метод тестирования JUnit:

 public void test1() throws InterruptedException { assertTrue(context != null); final Intent service = new Intent(); service.setComponent(new ComponentName(CoreService.PACKAGE_NAME, CoreService.SERVICE_FULL_NAME)); IBinder binder = bindService(service); assertTrue(binder != null); } 

Трассировка стека:

 java.lang.NullPointerException at android.app.Service.startForeground(Service.java:631) at com.blablabla.android.core.CoreService.doStartForeground(CoreService.java:82) at com.blablabla.android.core.CoreService.onCreate(CoreService.java:149) at android.test.ServiceTestCase.bindService(ServiceTestCase.java:234) at com.blablabla.android.core.test.MainTest.test1(MainTest.java:37) at java.lang.reflect.Method.invokeNative(Native Method) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169) at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154) at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:537) at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1551) 

Служба запускается правильно и отлично работает, когда не запускается через JUnit от Android.

Solutions Collecting From Web of "Service.startForeground () выдает исключение NullPointerException при запуске с ServiceTestCase"

Наконец, я добавил новое статическое поле в моей службе:

 /** JUNIT - this is for testing purposes only */ public static boolean isJUnit = false; 

И проверьте его в onCreate() :

 // Start the service as foreground (Android should not kill this // service) if (!isJUnit) { doStartForeground(); } 

Затем я устанавливаю этот флаг из setUp() JUnit:

 @Override protected void setUp() throws Exception { super.setUp(); // More setup MyServiceClass.isJUnit = true; } 

Не самое изящное решение, но выводит меня из блокады.