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

IHe*_*oid 23 testing android android-activity android-testing 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());
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

kei*_*ort 46

在我的情况下,我可以测试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());
    }
Run Code Online (Sandbox Code Playgroud)

另一个优点isFinishing()是,您不需要版本检查.

  • 我注意到您可以在测试代码后避免使用 `Thread.sleep()`。但是你忘了提到这一点,所以我编辑了你的答案,使这一点更加明确。 (2认同)

hea*_*d01 7

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

assertThat(activityRule.getActivityResult(), hasResultCode(Activity.RESULT_CANCELED));
Run Code Online (Sandbox Code Playgroud)


Pra*_*rma 6

ActivityTestRule现已弃用。所以,我的答案是基于ActivityScenario,它是 ActivityTestRule 的新替代方案。

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

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

  assertTrue(activityScenario.state == Lifecycle.State.DESTROYED)
}
Run Code Online (Sandbox Code Playgroud)
  • ActivityScenario.state 告诉被测活动的当前状态
  • Lifecycle.State.DESTROYED 告诉 Activity 已被销毁

方式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);
Run Code Online (Sandbox Code Playgroud)


kil*_*ler 0

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

如何从 FirstActivity 启动 Activity:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
Run Code Online (Sandbox Code Playgroud)

这就是如何完成 SecondActivity 返回到第一个(不发送结果):

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();
Run Code Online (Sandbox Code Playgroud)

如何在 SecondActivity 完成时引发事件(在 FirstActivity 中编写):

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

   if (requestCode == 1) {

   }
}//onActivityResult
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到更多信息:http://developer.android.com/training/basics/intents/result.html以及如何在 Android 上管理 `startActivityForResult`?还有如何发送您想要从 SecondActivity 获取的数据。


归档时间:

查看次数:

11594 次

最近记录:

5 年,11 月 前