Модульное тестирование Activity.startService () вызов? - PullRequest
9 голосов
/ 15 февраля 2012

Попытка написать свое первое приложение для Android за TDD (я написал несколько небольших приложений для Android без TDD, так что знаком с окружающей средой), но я не могу понять, как написать свое Первый тест.

Сценарий:

У меня есть активность TasksActivity и служба TasksService. Мне нужно проверить, что TasksActivity запускает TasksService в своем методе onStart ().

Тест, который я написал, таков:

public class ServiceControlTest extends ActivityUnitTestCase<TasksActivity>{
public ServiceControlTest() {
    super(TasksActivity.class);
}

public void testStartServiceOnInit () {
    final AtomicBoolean serviceStarted = new AtomicBoolean(false);
    setActivityContext(new MockContext() {
        @Override
        public ComponentName startService(Intent service) {
            Log.v("mockcontext", "Start service: " + service.toUri(0));
            if (service.getComponent().getClassName().equals (TasksService.class.getName()))
                serviceStarted.set(true);
            return service.getComponent();
        }
    });
    startActivity(new Intent(), null, null);
    assertTrue ("Service should have been started", serviceStarted.get());
}           
}

В моем методе onCreate () в TasksActivity у меня есть:

    startService(new Intent(this, TasksService.class));

Я тоже пробовал

    getBaseContext().startService(new Intent(this, TasksService.class));

Но ни в одном из случаев метод startService моего MockContext не вызывается. Есть ли способ настроить перехват этого метода? Я действительно предпочел бы не начинать упаковывать базовые API для Android, чтобы выполнять такие базовые тесты ...

1 Ответ

6 голосов
/ 16 февраля 2012

Просто для того, чтобы подвести итог разговору с Брайаном Дюпюи в комментариях, проблема заключалась в том, что MockContext не предоставляет средств, которые требуются контрольно-измерительным приборам для правильного вызова onCreate().Переключение с MockContext на ContextWrapper решило эту проблему.

Рабочий тест выглядит следующим образом:

public void testStartServiceOnInit () {
    final AtomicBoolean serviceStarted = new AtomicBoolean(false);
    setActivityContext(new ContextWrapper(getInstrumentation().getTargetContext()) {
        @Override
        public ComponentName startService(Intent service) {
            Log.v("mockcontext", "Start service: " + service.toUri(0));
            if (service.getComponent().getClassName().equals ("net.meridiandigital.tasks.TasksService"))
                serviceStarted.set(true);
            return service.getComponent();
        }
    });
    startActivity(new Intent(), null, null);
    assertTrue ("Service should have been started", serviceStarted.get());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...