浓缩咖啡不等到活动被破坏,然后为下一个测试创建新的浓缩咖啡



情况

在此处的官方文档中:https://google.github.io/android-testing-support-library/docs/rules/index.html,它说:

"此规则提供了单个活动的功能测试。 在注释每次测试之前,将启动正在测试的活动 @test和@before注释的任何方法之前。将是 测试完成后终止,所有方法都注释 @后完成。可以在测试中进行测试的活动 通过调用ActivityTestrule#getActivity()。"

从技术上讲,这项活动正在终止。,但似乎无法保证何时发生。例如。它不一定在为下一个测试再次创建之前发生。


问题

在我的某些测试中,我需要依靠每次测试后调用的片段ondestroy或ondetach, 开始下一个测试。我有需要清除和重新创建的听众。

如果在当前测试中的resmume on resmume中调用了上一个测试中的ondestroy,则清除回调,并且视图不会更新并且测试失败。

如果根本没有调用上一个测试的ondestroy,则当前测试中的回调将参考错误的实例。同样,视图不会更新,测试将失败。


问题

  1. 是在设计中讨论的这种行为吗?还是错误?我到目前为止无法在文档中找到它。
  2. 处理此问题的最佳实践是什么?我怀疑其他人面临这个问题。

编辑:我现在已经解决了第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方法上,并在调试模式下运行测试套件。

这样做几次,并注意到活动生命周期方法的顺序不一致。例如。它可能会连续两次调用Onresume,然后一次致电OnDestroy,然后再次拨入俄罗斯,然后两次侵入,然后ondestroy三次或您可以想到的任何其他组合。当然,它总是从至少一个on resume开始。有时,如果它在最后,它甚至都不会呼叫Ondestroy,但这很好。不正确的是我的测试是由于这种不可预见的顺序而片状的。

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


解决方案

使用Onpause Ondestroy上的Onpause具有在我开始启动时被调用的副作用,但在平板电脑模式下,在后台片段中不再次调用on Resume。我正在探索如何制作这项工作的方法,但尚无解决方案。

编辑: Onpause最终遇到了相同的问题 - 这是我首先使用OnDetach的部分原因。最终,有时候我不想脱离听众,直到片段被摧毁为止。

这使我达到了下一个有效的想法!hooray!到目前为止,我一直在为通话活动创建一个回调,因为它要求的东西,唯一如果该特定的回调不存在。事实证明,这是一个坏主意。我这样做了,因此我可以将回调数限制为所需的确切编号。动机是合理的,但实施需要所有这些回调清除。解决方案是重新创建每个回调,无论片段都被调用。如果它为null,始终创建它并替换以前的任何内容,请不要创建它。现在根本不需要清除它们(afaik)。

这是一个错误:http://b.android.com/201513

我使用叉子工作:https://github.com/shazam/fork

以前注意到了这个问题,我能想到的是'comptionTestrule中的方法: AfterActivityFined()>或 beforeActivityLaunched()strong>。基本上,您要检查并等待听众在下一次测试执行之前被清除。

imo,这是活动的错误。

最新更新