在为下一个测试创建新的活动之前,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).
解决方法:
是个错误:http://b.android.com/201513
我用叉子工作:https://github.com/shazam/fork
标签:android,android-espresso 来源: https://codeday.me/bug/20191010/1887815.html