Эспрессо, как проверить, завершено ли действие?

Я хочу утверждать, что моя Acitivty, которую я сейчас тестирую, завершается, когда выполняются определенные действия. К сожалению, пока я только утвержу, добавив немного сна в конце теста. Есть ли лучший способ?

import android.content.Context;
import android.os.Build;
import android.support.test.rule.ActivityTestRule;
import android.test.suitebuilder.annotation.LargeTest;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import static org.junit.Assert.assertTrue;

@SuppressWarnings("unchecked")
@RunWith(JUnit4.class)
@LargeTest
public class MyActivityTest {

    Context context;

    @Rule
    public ActivityTestRule<MyActivity> activityRule
            = new ActivityTestRule(MyActivity.class, true, false);

    @Before
    public void setup() {
        super.setup();
        // ...
    }

    @Test
    public void finishAfterSomethingIsPerformed() throws Exception {

        activityRule.launchActivity(MyActivity.createIntent(context));

        doSomeTesting();

        activityRule.getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                fireEventThatResultsInTheActivityToFinishItself();
            }
        });

        Thread.sleep(2000); // this is needed :(

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            assertTrue(activityRule.getActivity().isDestroyed());
        }

    }

}

Ответы

Ответ 1

В моем случае я могу проверить isFinishing():

assertTrue(activityTestRule.getActivity().isFinishing());

вместо:

    Thread.sleep(2000); // this is needed :(

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        assertTrue(activityRule.getActivity().isDestroyed());
    }

Другим преимуществом isFinishing() является то, что вам не нужна проверка версии.

Ответ 2

Может быть немного поздно, но это также возможно:

assertThat(activityRule.getActivityResult(), hasResultCode(Activity.RESULT_CANCELED));

Ответ 3

Вы можете использовать пример StartActivityForResult, более подробное описание в ссылках.

Как начать работу с FirstActivity:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

Как закончить SecondActivity, чтобы вернуться к первому (без результата отправки):

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Как повысить событие при завершении SecondActivity (написано в FirstActivity):

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

   if (requestCode == 1) {

   }
}//onActivityResult

Подробнее вы можете найти здесь: http://developer.android.com/training/basics/intents/result.html и там Как управлять `startActivityForResult` на Android? там также можно отправить данные, которые вы хотите получить из SecondActivity.

Ответ 4

Не уверен, что это хорошая практика, но это сработало для меня:

assertTrue(mTestRule.getActivity() == null);

Ответ 5

Вот подход проверки завершения активности при использовании AndroidX Test API:

  @Test
  fun activityShouldBeFinished() {
    val scenario = launchActivity<MyActivity>()

    onView(withText(R.string.finish_me)).perform(click())

    assertThat(scenario.state).isEqualTo(Lifecycle.State.DESTROYED)
  }