在为下一个测试创建新的活动之前,Espresso不等到Activity被销毁

情况

在这里的官方文档:https://google.github.io/android-testing-support-library/docs/rules/index.html中,它表示:

“This rule provides functional testing of a single activity. The
activity under test will be launched before each test annotated with
@Test and before any method annotated with @Before. It will be
terminated after the test is completed and all methods annotated with
@After are finished
. The Activity under Test can be accessed during
your test by calling ActivityTestRule#getActivity().”

从技术上讲是,该活动正在终止.但是似乎并不确定何时会发生.例如.它不一定会在为下一个测试再次创建之前发生.

问题

在我的某些测试中,我需要依赖于每个测试之后,下一个测试开始之前调用的OnDestroy或OnDetach片段.我有一些需要清除和重新创建的听众.

如果在当前测试的OnResume之后调用前一个测试的onDestroy,则将清除回调,并且视图不会更新,并且测试失败.

如果根本没有调用先前测试的onDestroy,则当前测试的回调将引用错误的实例.同样,视图将不会更新,并且测试将失败.

问题

>这种行为是在设计时针对情况进行讨论的还是错误?到目前为止,我在文档中找不到此内容.
>处理此问题的最佳实践是什么?我怀疑其他人已经遇到了这个问题.

编辑:我现在解决了第2部分.请参阅下面的解决方法部分.但是,如果有人可以通过引用官方资源来回答第一部分,那么我很乐意接受该回答.这就是我在这里真正要问的.第二部分只是如果有人有一些想法的奖金.

证据

如果您希望看到此行为,则只需几分钟.使用如下活动创建一个新项目:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

和这样的测试类:

@RunWith(AndroidJUnit4.class)
@LargeTest
public class EspressoLifecycleTest {

    @Rule
    public ActivityTestRule<MainActivity> mActivityRule =
        new ActivityTestRule<>(MainActivity.class);

    @Test
    public void test1() {
    }

    @Test
    public void test2() {
    }

    @Test
    public void test3() {
    }

    @Test
    public void test4() {
    }
}

在OnResume和OnDestroy方法上设置断点,并在调试模式下运行测试套件.

进行几次此操作,请注意,Activity生命周期方法的调用顺序不一致.例如.它可能连续调用两次OnResume,然后调用一次OnDestroy,然后再次调用OnResume,两次,然后两次OnDestroy,或者可以想到的任何其他组合.当然,它总是以至少一个OnResume开始.有时即使在最后也没有调用OnDestroy,但这很好.不好的是,由于这种不可预测的顺序,我的测试很不稳定.

我知道这可能是有意的,并且可能有一种简单的处理方法,我只是没有足够的幸运找到它.如果您知道这是什么,请在此处发布答案.事后看来,我不在乎我的问题有多愚蠢,我已经在这个问题上花了很多时间.这几乎总是简单的事情,所以我准备为答案感到尴尬.

解决方法

在onDestroy上使用onPause具有副作用,当我启动startActivityForResult时会被调用,但是在平板电脑模式下无需在后台片段中再次调用onResume.我正在探索使这项工作可行的方法,但目前尚无解决方案.

编辑:onPause最终遇到了相同的问题-这就是为什么我首先使用onDetach的部分原因.最终,在片段被销毁之前,我有时不想分离监听器.

这使我想到了下一个可行的想法!万岁!到目前为止,只有在特定的回调不存在的情况下,我才为正在调用的Activity创建一个回调.原来,这是一个坏主意.我这样做是为了将回调的数量限制为所需的确切数量.动机是合理的,但是实现需要清除所有这些回调.解决方案是在从片段调用时重新创建每个回调.如果它为null,请不要创建它,请始终创建它并替换之前的内容.现在完全不需要清除它们(AFAIK).

最佳答案

转载注明原文:在为下一个测试创建新的活动之前,Espresso不等到Activity被销毁 - 代码日志