У меня есть один актвитий с 2 редакторами текста и кнопкой.Когда я нажимаю кнопку, я запускаю асинхронный http запрос на Retrofit (вызов асинхронного метода enqueue()
) и жду ответа от обратного вызова.Для имитации длинного ответа (в примере 5 секунд) я использую MockWebServer
(https://github.com/square/okhttp/tree/master/mockwebserver).
Во время выполнения http-запроса выполняется индикатор выполнения. После получения ответа обратного вызова Retrofit индикатор выполнения скрывается. Приятно.
Поэтому мне нужно проверить, что во время выполнения http-запроса (не получен ответ) отображается индикатор выполнения.
Здесь тест Эспрессо:
@RunWith(AndroidJUnit4::class)
class AddTraderActivityTest {
private val context = InstrumentationRegistry.getInstrumentation().getContext()
private val targetContext = InstrumentationRegistry.getInstrumentation().getTargetContext()
private lateinit var mockServer: MockWebServer
@get:Rule
var addTraderIntentTestRule: IntentsTestRule<AddTraderActivity> = IntentsTestRule(AddTraderActivity::class.java)
private val baseEditText = viewWithId(baseTextInputEditText)
private val quoteEditText = viewWithId(quoteTextInputEditText)
private val buttonStart = viewWithId(startButton)
@Before
fun setup() {
mockServer = MockWebServer()
mockServer.start(8081)
}
@After
@Throws
fun tearDown() {
mockServer.shutdown()
}
@Test
fun buttonStart_click_longResponse() {
// stub response
mockServer.enqueue(MockResponse()
.setResponseCode(200)
.setBody(FileUtil.getStringFromFile(context, "add_trader_success_200.json"))
.setBodyDelay(5000, TimeUnit.MILLISECONDS))
baseEditText.type(BASE_TEST)
quoteEditText.type(QUOTE_TEST)
buttonStart.click()
Debug.d(TAG, "AFTER_CLICK")
onView(withText(containerProgressBarLayout)).check(matches(isDisplayed()))
}
fun viewWithId(@IdRes resId: Int): ViewInteraction {
return onView(withId(resId))
}
fun ViewInteraction.click(): ViewInteraction = perform(ViewActions.click())
Метод buttonStart.click()
вызовите следующий производственный код:
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) {
}
});
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);
}
здесь мой макет:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
android:id="@+id/jsonViewToolBar"
layout="@layout/tool_bar"
android:title='@{@string/add_trader}'
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/baseTextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="@dimen/default_margin"
android:layout_marginEnd="@dimen/half_default_margin"
android:text="@string/base"
android:textSize="@dimen/text_view_text_size"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/jsonViewToolBar" />
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/baseTextInputEditText"
style="@style/textViewOneLine"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textSize="@dimen/edit_text_text_size"
app:layout_constraintEnd_toEndOf="@+id/baseTextView"
app:layout_constraintStart_toStartOf="@+id/baseTextView"
app:layout_constraintTop_toBottomOf="@+id/baseTextView" />
<TextView
android:id="@+id/quoteTextView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/default_margin"
android:text="@string/quote"
android:textSize="@dimen/text_view_text_size"
app:layout_constraintEnd_toEndOf="@+id/baseTextView"
app:layout_constraintStart_toStartOf="@+id/baseTextView"
app:layout_constraintTop_toBottomOf="@+id/baseTextInputEditText" />
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/quoteTextInputEditText"
style="@style/textViewOneLine"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textSize="@dimen/edit_text_text_size"
app:layout_constraintEnd_toEndOf="@+id/baseTextView"
app:layout_constraintStart_toStartOf="@+id/baseTextView"
app:layout_constraintTop_toBottomOf="@+id/quoteTextView" />
<com.google.android.material.button.MaterialButton
android:id="@+id/startButton"
android:layout_width="0dp"
android:layout_height="@dimen/min_height"
android:layout_marginTop="@dimen/default_margin"
android:layout_marginBottom="@dimen/default_margin"
android:gravity="center"
android:onClick="@{() -> handler.onClickStart()}"
android:text="@string/start"
android:textSize="@dimen/tool_bar_text_size"
app:layout_constraintEnd_toEndOf="@+id/baseTextView"
app:layout_constraintStart_toStartOf="@+id/baseTextView"
app:layout_constraintTop_toBottomOf="@+id/quoteTextInputEditText"
app:textAllCaps="true" />
<include
layout="@layout/progress_bar_layout"
android:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
здесь progress_bar_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/containerProgressBarLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#4777"
android:clickable="true"
android:elevation="2dp"
android:focusable="true">
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyle"
android:layout_width="@dimen/min_height"
android:layout_height="@dimen/min_height"
android:indeterminateTint="@color/colorPrimary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Но этот тест не пройден, потому что:
call buttonStart.click ()
показать индикатор выполнения
Подождите 5 секунд
получить ответ на заглушку
скрыть индикатор выполнения
Распечатать в журнале «AFTER_CLICK» и позвонить onView(withText(containerProgressBarLayout)).check(matches(isDisplayed()))
.
Как результат теста не пройден, потому что при вызове onView(withText(containerProgressBarLayout)).check(matches(isDisplayed()))
индикатор выполнения уже скрыт. Как результат проверки не пройден.
Так как я могу проверитьk Индикатор выполнения показывает, пока не получен ответ на заглушку?