При запуске моего приложения для Android сначала запустите FirstActivity. Когда я нажимаю кнопку, FirstActivityчем start AddTraderActivity. Если я нажимаю кнопку " СТАРТ ЗАПРОС ", AddTraderActivityто я вызываю:
setResult(RESULT_OK);
finish();
Как результат AddTraderActivity- уничтожить и показать FirstActivity. Ницца.
Теперь я хочу написать тесты Espresso для AddTraderActivityTest. Вот тесты:
@RunWith(AndroidJUnit4::class)
@SmallTest
class AddTraderActivityTest {
@get:Rule
var addTraderActivity: IntentsTestRule<AddTraderActivity> =
IntentsTestRule(AddTraderActivity::class.java)
@Test
fun toolBarHeight() {
onView(withId(R.id.toolBar))
.check(matches(withHeightResId(R.dimen.tool_bar_height)))
}
@Test
fun buttonStartTextUppercase() {
onView(withId(R.id.startButton))
.check(matches(withTextUppercaseResId(R.string.start)))
}
}
В результате, когда я запускаю эти тесты, затем запускаю ТОЛЬКО AddTraderActivityи тесты проходят успешно. Ницца.
Теперь я хочу написать тест для нажатия на кнопку " НАЧАТЬ ЗАПРОС "
Вот тест:
@Test
fun pressButtonStartProgressBarDisplayed() {
onView(withId(R.id.baseTextInputEditText)).perform(typeText("BASE_TEST"))
onView(withId(R.id.quoteTextInputEditText)).perform(typeText("QUOTE_TEST"))
onView(withId(R.id.startButton)).perform(click())
onView(withId(R.id.containerProgressBarLayout)).check(matches(isDisplayed()))
}
В результате при тестовом запуске и нажатии кнопки " START REQUEST " я получаю следующую ошибку:
Тестирование началось в 16:05...
$ adb shell am instrument -w -r -e debug false -e class 'com.myproject.AddTraderActivityTest#pressButtonStartProgressBarDisplayed' com.myproject.debug.test/androidx.test.runner.AndroidJUnitRunner
Client not ready yet..
Started running tests
java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar?
at androidx.test.espresso.base.RootViewPicker.waitForAtLeastOneActivityToBeResumed(RootViewPicker.java:169)
at androidx.test.espresso.base.RootViewPicker.get(RootViewPicker.java:83)
at androidx.test.espresso.ViewInteractionModule.provideRootView(ViewInteractionModule.java:77)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.provideRootView(ViewInteractionModule_ProvideRootViewFactory.java:35)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:24)
at androidx.test.espresso.ViewInteractionModule_ProvideRootViewFactory.get(ViewInteractionModule_ProvideRootViewFactory.java:10)
at androidx.test.espresso.base.ViewFinderImpl.getView(ViewFinderImpl.java:62)
at androidx.test.espresso.ViewInteraction$2.call(ViewInteraction.java:276)
at androidx.test.espresso.ViewInteraction$2.call(ViewInteraction.java:268)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Я получаю эту ошибку, потому что в стеке нет активности FirstActivity, потому что мой тест не запускает его. Итак, вопрос. Как я могу только ИЗОЛИРОВАТЬ тест AddTraderActivity?
Решение проблемы
Эта проблема может возникнуть, если вы мигрируете из ActivityTestRuleв ActivityScenarioRule(или ActivityScenario) и пытаетесь протестировать действие, в onCreate()методе которого есть следующий код:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Workaround the Android bug of multiple Activity task stacks when
// the app is launched from the Google Play Store. See:
// https://issuetracker.google.com/issues/36941942
// https://stackoverflow.com/questions/4341600/multiple-instances-of-activity-from-google-play-launch
// https://stackoverflow.com/questions/19545889/app-restarts-rather-than-resumes
if (!isTaskRoot() &&
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) &&
Intent.ACTION_MAIN.equals(getIntent().getAction())) {
finish();
return;
}
...
}
Этот код отлично работал с ActivityTestRule. Но не работает с ActivityScenarioRuleили ActivityScenario, потому что вызывает ошибки, когда тест пытается запустить Activity:
- Либо:
"java.lang.RuntimeException: No activities found. Did you forget to launch the activity by calling getActivity() or startActivitySync or similar?" - Или:
"The @Rule activityScenario must implement MethodRule or TestRule"
Проблема возникает из-за того, что тест запускает действие, а затем сразу же закрывает его в onCreate(). Таким образом, вы должны удалить весь ifблок при использовании ActivityScenarioRuleили ActivityScenarioили добавить дополнительный логический параметр в ifпредложение, чтобы проверить, выполняете ли вы тест пользовательского интерфейса.
Комментариев нет:
Отправить комментарий