ServiceTestRule: невозможно создать обработчик внутри потока, который не вызвал Looper.prepare()

Я создал класс для тестирования Service, который использует ServiceTestRule. Я получаю исключение, когда пытаюсь получить объект системной службы с помощью context.getSystemService(Context.SYSTEM_SERVICE_NAME).

StackTrace исключения:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:200)
at android.os.Handler.<init>(Handler.java:114)
at android.content.ClipboardManager$2.<init>(ClipboardManager.java:69)
at android.content.ClipboardManager.<init>(ClipboardManager.java:69)
at android.app.ContextImpl$11.createService(ContextImpl.java:405)
at android.app.ContextImpl$ServiceFetcher.getService(ContextImpl.java:297)
at android.app.ContextImpl.getSystemService(ContextImpl.java:1832)
at android.view.ContextThemeWrapper.getSystemService(ContextThemeWrapper.java:113)
at android.app.Activity.getSystemService(Activity.java:5003)

Тестовый класс:

@RunWith(AndroidJUnit4.class)
public class ClipboardServiceTest {

    private static final String ANY_LABEL = "Android";
    private static final String ANY_TEXT = "Android test rules";

    private Context context = InstrumentationRegistry.getTargetContext();

    @Rule
    public ServiceTestRule serviceTestRule = new ServiceTestRule();

    @Before
    public void setUp() throws TimeoutException {
        serviceTestRule.startService(new Intent(InstrumentationRegistry.getContext(), ClipboardService.class));
    }

    @Test
    public void shouldShowClipboardViewOnCopyText() {
        ClipboardManager clipboard = (ClipboardManager) context
                .getSystemService(Context.CLIPBOARD_SERVICE);

        ClipData clip = ClipData.newPlainText(ANY_LABEL, ANY_LABEL);
        clipboard.setPrimaryClip(clip);

        onView(withText(ANY_TEXT)).check(matches(isDisplayed()));
    }
}

Как я могу получить системные сервисные объекты (менеджеры)?


person Robertas Setkus    schedule 07.05.2016    source источник


Ответы (1)


Обычно вы получаете эту ошибку, когда пытаетесь вызвать что-то из рабочего потока, хотя он предназначен для вызова из основного потока. Что сработало для меня, так это объявить аннотацию @UiThreadTest для тестовой функции следующим образом:

@Test
@UiThreadTest
public void shouldShowClipboardViewOnCopyText() {
    ...
}
person Daniel Zolnai    schedule 25.06.2019