Невозможно проверить представление, пока не получен ответ на заглушку - PullRequest
0 голосов
/ 08 мая 2019

У меня есть один актвитий с 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>

Но этот тест не пройден, потому что:

  1. call buttonStart.click ()

  2. показать индикатор выполнения

  3. Подождите 5 секунд

  4. получить ответ на заглушку

  5. скрыть индикатор выполнения

  6. Распечатать в журнале «AFTER_CLICK» и позвонить onView(withText(containerProgressBarLayout)).check(matches(isDisplayed())).

Как результат теста не пройден, потому что при вызове onView(withText(containerProgressBarLayout)).check(matches(isDisplayed())) индикатор выполнения уже скрыт. Как результат проверки не пройден.

Так как я могу проверитьk Индикатор выполнения показывает, пока не получен ответ на заглушку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...