Intereting Posts
Нужен ли мне контент-провайдер с загрузчиком курсора? Можно ли вставить столбец в listview во время выполнения? Ошибка: не удалось выполнить целевое «андроид-2» Adt не создает мир приветствия по умолчанию, но в командной строке Удержание Android от отдельного аккаунта Какой браузер использует Galaxy Galaxy? Невозможно найти цели Android в этом SDK в IntelliJ 2016 Android Получить текущую дату (со временем 0: 00: 000) в миллисекундах? Совет по партнерским программам для музыки для Android-приложений Как узнать, отключен ли пользователь на экране блокировки Для библиотек поддержки Android Material, где я могу найти CardView и RecyclerView? Отключение файлов cookie в браузере Android не работает Исключенное исключение окна, даже если служба не используется Студия Android после переименования пакета, который он выбрал. Не найдено соответствующего клиента Скрыть инф.истовую карту api v2

Робоэлектрические и IntentServices

Используя Robolectric, как можно было бы протестировать IntentService, который транслирует намерения в качестве ответа?

Предполагая следующий класс:

class MyService extends IntentService { @Override protected void onHandleIntent(Intent intent) { LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("action")); } } 

В моем тестовом примере я пытаюсь сделать что-то вроде этого:

 @RunWith(RobolectricTestRunner.class) public class MyServiceTest{ @Test public void testPurchaseHappyPath() throws Exception { Context context = new Activity(); // register broadcast receiver BroadcastReceiver br = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // test logic to ensure that this is called } }; context.registerReceiver(br, new IntentFilter("action")); // This doesn't work context.startService(new Intent(context, MyService.class)); } } 

MyService никогда не начинал использовать этот подход. Я относительно новичок в Robolectric, поэтому, вероятно, я пропустил что-то очевидное. Есть ли какая-то привязка, которую я должен выполнить перед вызовом startService? Я проверил, что трансляция работает, просто позвонив sendBroadcast в контекст. Есть идеи?

Solutions Collecting From Web of "Робоэлектрические и IntentServices"

Вы не можете проверить инициализацию сервиса, как вы пытаетесь сделать. Когда вы создаете новое действие под 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 , так что я его оставил.

EDIT : Возможно, имеет смысл сделать создание / уничтожение службы в @Before JUnit @Before / @After , что позволит вашему тесту содержать onStartCommand и «test test test».