Я хотел протестировать класс в фреймворке, который запускает разные сервисы в зависимости от намерения. Однако у меня возникают проблемы с созданием 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 внутри основного пакета, к сожалению, для меня тоже не вариант :(
androidTest
) с отдельнымAndroidManifest.xml
, объявляющим тестовую службу, чтобы эта техника работала. См. раздел Использование непроизводственной активности для тестирования с помощью Android Studio - person David Rawson   schedule 13.01.2018