2014-11-19 5 views
1

Я пишу тест на Service с помощью Robolectric 2.4:NullPointerException при получении WindowManager от службы при Robolectric

@RunWith(RobolectricTestRunner.class) 
public class MyServiceTest { 

    @Test 
    public void someTest() { 
     Robolectric.buildService(MyService.class) 
      .create() 
      .get() 
      .getSystemService(Context.WINDOW_SERVICE); 
    } 

} 

Когда getSystemService называется на Service, NullPointerException брошено, как показано ниже:

java.lang.NullPointerException 
    at android.content.ContextWrapper.getSystemService(ContextWrapper.java:519) 
    at MyServiceTest.someTest(MyServiceTest.java:10) 

Проблема не возникает, когда я звоню getSystemService по телефону Robolectric.application или Robolectric -изложил Activity; это, по-видимому, проблема, характерная для услуг.

В реальных тестах моя служба пытается получить WindowManager, используя себя как Context, поэтому я не могу просто использовать Robolectric.application, чтобы получить его.

ответ

4

Контекст без контекста.

Перед созданием экземпляра службы необходимо приложить Контекст. Так что просто позвоните attach() до create().

Так это будет выглядеть следующим образом:

@RunWith(RobolectricTestRunner.class) 
public class MyServiceTest { 

    @Test 
    public void someTest() { 
     Robolectric.buildService(UpdateService.class) 
      .attach() 
      .create() 
      .get() 
      .getSystemService(Context.WINDOW_SERVICE); 
    } 

} 

Обновление для Robolectric> = 3,3 В Robolectric 3.3 с подключением теперь осуждается и будет удалена в 3.4 (see api doc). Поэтому с 3.3 вы можете отказаться от приложенного вызова (благодаря @inder).

@RunWith(RobolectricTestRunner.class) 
public class MyServiceTest { 

    @Test 
    public void someTest() { 
     Robolectric.buildService(UpdateService.class) 
      .create() 
      .get() 
      .getSystemService(Context.WINDOW_SERVICE); 
    } 

} 
+0

attach() теперь устарел – inder

Смежные вопросы