Android: эспрессо: клик блокирует пользовательский интерфейс и не может выполнить следующую проверку - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть активность с кнопкой. При нажатии на эту кнопку я показываю конкретный макет. Я хочу написать тест эспрессо, который проверяет, чем если нажать кнопку, то показать конкретный макет. Вот тест:

@RunWith(AndroidJUnit4::class)
class AddTraderActivityTest {
    // The IntentsTestRule class initializes Espresso Intents before each test, terminates the host activity, and releases Espresso Intents after each test
    @get:Rule
    var addTraderActivity: IntentsTestRule<AddTraderActivity> = IntentsTestRule(AddTraderActivity::class.java)

@Test
fun allFieldsFill_buttonStart_click_progress_isDisplayed() {
    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())

    // not execute while not finish click
    onView(withId(R.id.containerProgressBarLayout))
        .check(matches(isDisplayed()))
} 

Проблема в том, что при вызове .perform(click()) следующий метод

onView(withId(R.id.containerProgressBarLayout))
    .check(matches(isDisplayed()))

- это , а не . Пока работа click() не закончена (нажатие на кнопку запускает HTTP-запрос). Через N секунд (после завершения запроса) затем Espresso продолжите выполнение и оцените .check(matches(isDisplayed().

Но мне нужно проверить, отображается ли мой конкретный макет при нажатии на кнопку.

Здесь орудие нажатия кнопки. Когда нажмете кнопку start ASYNC http запрос от Retrofit 2. После завершения вызовите метод обратного вызова для получения результата.

 public void doClickStart(String base, String quote) {
        isHidekKeyboardLiveData.setValue(true);
        isShowProgressLiveData.setValue(true);
        TransportService.executeTraderOperation(Trader.Operation.CREATE, base.trim(), quote.trim(), new DefaultRestClientCallback<Void>() {
            @Override
            public void onSuccess(Response<Void> response) {
                isShowProgressLiveData.setValue(false);
                isForwardToTradersLiveData.setValue(true);
            }

            @Override
            public void onError(ErrorResponse errorResponse) {
                isShowProgressLiveData.setValue(false);
                String message = errorResponse.getMessage();
                messageLiveData.setValue(new SingleEvent(message));
            }
        });
    }

public static void executeTraderOperation(Trader.Operation traderOperation, String base, String quote, Callback<Void> callback) {
        TraderMonitorRestClient traderMonitorRestClient = RestClientFactory.createRestClient(TraderMonitorRestClient.class);
        String sender = BuildConfig.APPLICATION_ID + "_" + BuildConfig.VERSION_NAME;
        String key = DateUtil.getDateAsString(new Date(), "mmHHddMMyyyy");
        Call<Void> call = traderMonitorRestClient.executeTraderOperation(traderOperation.toString().toLowerCase(), base, quote, sender, key);
        // asynchronously
        call.enqueue(callback);
    }

о своей активности Я заканчиваю текущую активность после завершения клика:

 addTraderViewModel.getIsForwardToTradersLiveData().observe(this, new Observer<Boolean>() {
            @Override
            public void onChanged(Boolean isForwardToTraders) {
                if (isForwardToTraders) {
                    setResult(RESULT_OK);
                    finish();
                }
            }
        });

вот результат теста на сбой:

$ adb shell am instrument -w -r   -e debug false -e class 'com.myproject.activity.AddTraderActivityTest#allFieldsFill_buttonStart_click_progress_isDisplayed' 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)

1 Ответ

0 голосов
/ 16 апреля 2019

Начиная с кода ошибки, ваш Activity не запускается для тестов.Используйте этот код, чтобы смоделировать действие:

@get:Rule
var activityRule: ActivityTestRule<YourActivity> =
   ActivityTestRule(YourActivity::class.java)

ИЛИ , если вам нужно передать аргументы для этого действия, к этому:

@get:Rule
var activityRule: ActivityTestRule<YourActivity> =
   ActivityTestRule(YourActivity::class.java)

@Test
fun `test activity X`() {
   val intent = Intent()
   intent.putExtra("your_key", "your_value");
   activityRule.launchActivity(intent)
}
...