Espresso如何测试活动是否完成?

时间:2016-03-08 09:06:56

标签: android android-activity android-espresso

我想声明我正在测试的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());
        }

    }

}

8 个答案:

答案 0 :(得分:43)

在我的情况下,我可以测试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()的另一个优点是,您不需要版本检查。

答案 1 :(得分:2)

也许有点晚,但这也是可能的:

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

答案 2 :(得分:0)

您可以使用下面的StartActivityForResult示例,链接中的更多说明。

如何从FirstActivity启动Activity:

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以及How to manage `startActivityForResult` on Android?以及如何发送您想要从SecondActivity获取的数据。

答案 3 :(得分:0)

不确定这是否是一个好习惯,但这对我有用:

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

答案 4 :(得分:0)

这是一种使用AndroidX Test API时验证活动完成的方法:

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

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

    assertThat(scenario.result.resultCode).isEqualTo(Activity.RESULT_CANCELED)
  }

这似乎有点笨拙的代码,但这是一种对我有用的方法。我希望以下验证能够正常工作,但不幸的是,它不可靠(有时测试通过,大多数情况下不通过):

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

ActivityScenario.getResult()提供了我们想要的行为-等待活动完成:

  

等待活动完成并返回活动结果。

     

注意:此方法不会调用finish()。活动必须完成或结束,否则此方法将在超时后引发运行时异常。

答案 5 :(得分:0)

我在https://stackoverflow.com/a/56491860/9402979找到了解决方案,您可以使用

Espresso.pressBackUnconditionally()
assertTrue(activityRule.activity.isDestroyed)

答案 6 :(得分:0)

如果您尚未在活动中设置结果,则可以使用:

assertTrue(activityRule.scenario.result.resultCode == Activity.RESULT_CANCELED)

答案 7 :(得分:0)

ActivityTestRule 现在已弃用。因此,我的回答基于 ActivityScenario,它是 ActivityTestRule 的新替代方案。

测试当前活动是否完成(销毁)。你可以简单地编码 -

Way.1 ActivityScenario.launch(YourActivityName::class.java).use { activityScenario -> //你的测试代码

  assertTrue(activityScenario.state == Lifecycle.State.DESTROYED)
}
  • activityScenario.state 告诉被测活动的当前状态
  • Lifecycle.State.DESTROYED 表示 Activity 已被销毁

Way.2

ActivityScenario<MyActivity> scenario = ActivityScenario.launch(MyActivity.class);
   // Let's say MyActivity has a button that finishes itself.
   onView(withId(R.id.finish_button)).perform(click());
   assertThat(scenario.getResult().getResultCode()).isEqualTo(Activity.RESULT_OK);