Ответ 1
Вы не можете протестировать инициализацию службы, как вы пытаетесь сделать. Когда вы создаете новое действие под Robolectric, деятельность, которую вы возвращаете, на самом деле является ShadowActivity
(вид). Это означает, что при вызове startService
метод, который фактически выполняется, этот, который просто вызывает ShadowApplication#startService
. Это содержимое этого метода:
@Implementation
@Override
public ComponentName startService(Intent intent) {
startedServices.add(intent);
return new ComponentName("some.service.package", "SomeServiceName-FIXME");
}
Вы заметите, что на самом деле он вообще не пытается запустить службу. Он просто отмечает, что вы попытались запустить службу. Это полезно для случая, когда какой-либо тестируемый код должен запустить службу.
Если вы хотите проверить фактический сервис, я думаю, вам нужно смоделировать жизненный цикл службы для бит инициализации. Возможно, что-то подобное:
@RunWith(RobolectricTestRunner.class)
public class MyServiceTest{
@Test
public void testPurchaseHappyPath() throws Exception {
Intent startIntent = new Intent(Robolectric.application, MyService.class);
MyService service = new MyService();
service.onCreate();
service.onStartCommand(startIntent, 0, 42);
// TODO: test test test
service.onDestroy();
}
}
Я не знаком с тем, как Robolectric относится к BroadcastReceiver
s, поэтому я его оставил.
РЕДАКТИРОВАТЬ. Может возникнуть еще больше смысла делать создание/уничтожение службы в методах JUnit @Before
/@After
, что позволит вашему тесту содержать только теги onStartCommand
и "test test test".