AndroidJUnit4ClassRunner выбрасывает RuntimeException Android

Я разрабатываю приложение для Android. Я пишу тест Junit для Android, и я новичок в тестовом примере Junit.

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

Я хочу протестировать эти действия с помощью Junit. Когда я пытаюсь запустить тестовый пример, он выдает следующую ошибку:

java.lang.RuntimeException: Can't create handler inside thread Thread[Instr: androidx.test.runner.AndroidJUnitRunner,5,main] that has not called Looper.prepare()
at android.os.Handler.<init>(Handler.java:205)
at android.os.Handler.<init>(Handler.java:118)
at android.app.Dialog.<init>(Dialog.java:123)
at android.app.AlertDialog.<init>(AlertDialog.java:201)
at android.app.AlertDialog.<init>(AlertDialog.java:197)
at android.app.DatePickerDialog.<init>(DatePickerDialog.java:115)
at android.app.DatePickerDialog.<init>(DatePickerDialog.java:90)
at com.example.sride.DataSelectedTest.loginClickedSuccess(DataSelectedTest.java:74)

Вот мой тестовый класс:

@RunWith(AndroidJUnit4ClassRunner.class)
public class DataSelectedTest {

    private Context appContext;

    @Test
    public void useAppContext() {
        // Context of the app under test.
        appContext = ApplicationProvider.getApplicationContext();
        assertEquals("com.example.sride", appContext.getPackageName());
    }

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>(MainActivity.class);

    @Test
    public void datCheckSuccess() throws Throwable {
        Log.e("@Test", "Performing date check success test");
        Espresso.onView((withId(R.id.calendarRl)))
                .perform(ViewActions.click());

        // throwing error at this line
        // If I remove this line then it is working as expected
        DatePickerDialog datePickerDialog =
                new DatePickerDialog(mActivityRule.getActivity(), null, 2012, 6, 7);

        datePickerDialog.dismiss();

        Espresso.onView(withId(R.id.dateTv))
                .check(matches(withText("7" + "-" + (6 + 1) + "-" + "2012")));
    }
}

Я тоже пробовал эти коды запускать внутри runOnUiTHeard() но проблема все еще сохраняется.

Я тоже пробовал эти коды запускать внутри Handler() но тест будет продолжать работать, не показывая никаких результатов

Я что-то пропустил?

1 ответ

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

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

Другие вопросы по тегам