2012-11-13 13 views
7

This bilinen bir can sıkıcı 2 yaşındaki Android hatasıdır.Service.startForeground() ServiceTestCase ile çalıştırıldığında NullPointerException atar

Sorunun, Android kaynak kodunu değiştirmenin ve bir daha derlemenin yanı sıra bu sorunla ilgili herhangi bir geçici çözüm bilen var mı? NPE yükseltir

My Servis alt sınıf yöntemi: Bu onCreate() yöntem geçersiz kılma işleminden

/** Shows notification of started service */ 
private void doStartForeground() { 

    // Prepare notification 
    final NotificationHelper nh = doNotification("Service started"); 

    // Start foreground 
    startForeground(nh.getNotificationId(), nh.getNotification()); 
} 

denir

İşte tamamlanma uğruna benim kod.

Ve JUnit test yöntemi:

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

Yığın izleme:

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) 

Hizmeti düzgün başlar ve Android'in JUnit üzerinden çalışmasını değilken çalışıyor.

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

Ve onCreate() yönteminde kontrol:

cevap

6

Sonunda benim Service yeni bir statik alan ekleyerek sona erdi

: Ben JUnit en setUp() bu bayrağı set Sonra
// Start the service as foreground (Android should not kill this 
// service) 
if (!isJUnit) { 
    doStartForeground(); 
} 

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

En zarif çözüm değil ama beni ablukadan çıkarır.

+1

Korkunç! Bunu bulmak için teşekkürler. Sorun, burada ADT forumunda belirtilmiştir: https://code.google.com/p/android/issues/detail?id=12122 – Snicolas

+1

Evet Bunu gördüm (bağlantı, söz konusu). Şimdi 3 yaşında ve sayıyor ... – m0skit0

+0

Sadece eski gibi gözüküyordu, ancak emin değilim. – Xiao

İlgili konular