Тестирование Android новой службы в тестовом пакете

Я хотел протестировать класс в фреймворке, который запускает разные сервисы в зависимости от намерения. Однако у меня возникают проблемы с созданием TestService внутри androidTest/ при запуске подключенного теста Android. Метод getService возвращает null.

Заранее спасибо за любые рекомендации и помощь!

@RunWith(AndroidJUnit4.class)
public class WakefulIntentSenderTest {
    private static final String SOME_ACTION = "someAction";

    private static class TestService extends Service {
        private boolean mCalled;

        @Override
        public void onCreate() {
            super.onCreate();
        }

        @Override
        public IBinder onBind(final Intent intent) {
            return null;
        }

        @Override
        public int onStartCommand(final Intent intent, final int flags, final int startId) {
            mCalled = true;
            return 0;
        }

        public boolean wasCalled() {
            return mCalled;
        }

        public class TestServiceBinder extends Binder {

        public TestService getService() {
            return TestService.this;
        }
    }

    @Test
    public void testWithBoundService() throws TimeoutException {
        // Create the service Intent.
        Intent serviceIntent =
                new Intent(InstrumentationRegistry.getTargetContext(), TestService.class);

        InstrumentationRegistry.getTargetContext().startService(intent);

        // Bind the service and grab a reference to the binder.
        IBinder binder = mServiceRule.bindService(serviceIntent);

        // Get the reference to the service, or you can call public methods on the binder directly.
        TestService service = ((TestService.TestServiceBinder) binder).getService();

        // Verify that the service is working correctly.
        assertEquals(service.wasCalled(), true);
    }
}

У меня также есть другие вопросы, где TestService действительно создается внутри пакета «Тест». Если я попытаюсь запустить TestService через контекст приложения, это выдаст мне сообщение об ошибке Unable to start service Intent { cmp=com.example.abc.test/com.example.abc.WakefulIntentSenderTest$TestService } U=0: not found error.

И приведенный выше код действительно просто демонстрирует, могу ли я запустить службу.

Еще немного информации... InstrumentationRegistry вернет com.example.abc при вызове getTargetContext() и com.example.abc.test при вызове getContext().

Что я действительно хотел протестировать, так это класс, стоящий за com.example.abc, который использует PowerManager для запуска службы с Wakelock. Но пока это у меня в голове, потому что я даже не могу запустить службу из тестового пакета.

Наличие TestService внутри основного пакета, к сожалению, для меня тоже не вариант :(


person Dillon    schedule 10.01.2018    source источник
comment
Я думаю, вам нужно будет создать вариант тестовой сборки (а не просто androidTest) с отдельным AndroidManifest.xml, объявляющим тестовую службу, чтобы эта техника работала. См. раздел Использование непроизводственной активности для тестирования с помощью Android Studio   -  person David Rawson    schedule 13.01.2018


Ответы (2)


https://developer.android.com/training/testing/integration-testing/service-testing.html

Android предоставляет прямой способ получить ссылку на сервис.

person user3219477    schedule 17.01.2018

Вам нужно вернуть экземпляр вашего класса TestServiceBinder в TestService#onBind

person superJustin    schedule 03.03.2019