Android 浓缩咖啡如何测试活动是否完成?

Android 浓缩咖啡如何测试活动是否完成?,android,testing,android-activity,android-espresso,android-testing,Android,Testing,Android Activity,Android Espresso,Android Testing,我想断言,当执行某些操作时,我当前正在测试的活动已经完成。不幸的是,到目前为止,我只是通过在测试结束时添加一些睡眠来证明这一点。有更好的办法吗 import android.content.Context; import android.os.Build; import android.support.test.rule.ActivityTestRule; import android.test.suitebuilder.annotation.LargeTest; import org.jun

我想断言,当执行某些操作时,我当前正在测试的活动已经完成。不幸的是,到目前为止,我只是通过在测试结束时添加一些睡眠来证明这一点。有更好的办法吗

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());
        }

    }

}
导入android.content.Context;
导入android.os.Build;
导入android.support.test.rule.ActivityTestRule;
导入android.test.suitebuilder.annotation.LargeTest;
导入org.junit.Before;
导入org.junit.Rule;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.junit.runners.JUnit4;
导入静态org.junit.Assert.assertTrue;
@抑制警告(“未选中”)
@RunWith(JUnit4.class)
@最大的
公共类MyActivityTest{
语境;
@统治
公共活动测试规则活动规则
=新的ActivityTestRule(MyActivity.class,true,false);
@以前
公共作废设置(){
super.setup();
// ...
}
@试验
public void finishAfterSomethingIsPerformed()引发异常{
activityRule.launchActivity(MyActivity.createIntent(上下文));
剂量测定法();
activityRule.getActivity().runOnUiThread(新的Runnable()){
@凌驾
公开募捐{
导致活动完成自身()的火灾事件;
}
});
Thread.sleep(2000);//这是必需的:(
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.JELLY\u BEAN\u MR1){
assertTrue(activityRule.getActivity().isDestroyed());
}
}
}

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

如何从FirstActivity开始活动:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

   if (requestCode == 1) {

   }
}//onActivityResult
这就是如何完成第二个活动以返回到第一个(不发送结果):

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


您可以在这里找到更多信息:还有您如何发送希望从SecondActivity获取的数据。

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

不确定这是否是一个好的做法,但这对我来说很有效:

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

可能有点晚,但也有可能:

assertThat(activityRule.getActivityResult(), hasResultCode(Activity.RESULT_CANCELED));
我在这里找到了一个解决方案,您可以使用

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

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

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

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

测试当前活动是否已完成(销毁)-

方式1 启动(YourActivityName::class.java)。使用{ActivityScenario-> //您的测试代码

  assertTrue(activityScenario.state == Lifecycle.State.DESTROYED)
}
  • activityScenario.state告诉被测活动的当前状态
  • Lifecycle.State.DESTROYED表示活动已销毁
方式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);
ActivityScenario=ActivityScenario.launch(MyActivity.class);
//假设MyActivity有一个自动完成的按钮。
onView(使用id(R.id.finish_按钮)).perform(单击());
断言(scenario.getResult().getResultCode()).isEqualTo(Activity.RESULT\u OK);

谢谢您的回答。我想我还不够清楚。我的问题是我没有第二个活动或第一个活动。我只有一个活动。因此,只有当我启动一个虚拟的第一个活动以便能够启动我的活动时,我才可以使用您的解决方案,我想从那里开始测试。所以您有了您的runnable并想做一些事情完成后?我想确保我的活动在导致ActivityToFinishitself()的FireEvents之后关闭;使用
isFinishing()将其称为安全事件
很好,但你没有提到问题的要点,即如何解决睡眠问题。据我所知,OP要求的是一种更好的断言方法,这样他就可以避免
线程。sleep
。我注意到你可以避免
线程。sleep()
在测试代码之后。但是你忘了提到这一点,所以我编辑了你的答案,使这一点更加明确。
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);