У меня есть активность с кнопкой. При нажатии на эту кнопку я показываю конкретный макет.
Я хочу написать тест эспрессо, который проверяет, чем если нажать кнопку, то показать конкретный макет.
Вот тест:
@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)