Espresso 未启动 Activity 与参数化测试中的第二次迭代相同
Espresso not starting Activity the same for second iteration in parameterised test
在使用参数化测试时,Espresso 运行s 在第一次测试后的测试方式有什么不同吗?
我有两个参数,它们都 运行 如果我自己做它们就好了(如果我注释掉其中一个并且只有一个参数),或者如果我颠倒第一个的顺序总是过去。
但出于某种原因,当我 运行 将它们放在一起时,第二个总是失败。实际上,有一次它没有失败。在不改变任何东西的情况下,它工作了一次。但只有一次。所以可能存在错误,但我倾向于认为这是我正在做(或没有做)的事情。
实际发生的问题是一个字段在测试中途被设置为空(根据调试器)。但我似乎无法弄清楚如何或为什么,特别是因为它不会在第一次测试中发生。所以我在代码中找不到任何明显的东西,但我也看不出 Espresso 有什么不同。有什么想法吗?
我跟踪了调试器,它向我证明了该值已设置,然后出于某种原因,当它暂停当前 Activity 以启动对话框时,该值被设置为 null。但仅限于第二次测试。在第一次测试的这种完全相同的情况下,它不会那样做。为什么?
编辑:
好的,我已经进一步缩小了范围,但仍然不确定为什么要这样做。这有点奇怪,但我通过调试器发现,第一次测试中的 onDetach 在第二次测试中被称为 after onResume。为什么会这样?
无论如何,这绝对是我遇到问题的原因,因为使值变为 null 的代码源自 onDetach,而该值最初是从 onResume 中的方法设置的。所以这解释了它。但为什么会这样?
此处记录的问题:https://code.google.com/p/android/issues/detail?id=235247
好的,我找到了解决方案。由于在当前测试中 onResume 之后调用了先前测试的 onDestroy,因此我将 onDestroy 中用于清除监听器的代码移至 onResume 的开头。现在,当 onResume 中的其他代码运行时,它不会因 onDestroy 的错误时机而失效。监听器通过存储库访问,该存储库始终保持活动状态。
希望这一切对阅读的任何人都有意义,以防他们遇到类似的问题。到目前为止,我还没有注意到此解决方法的任何副作用。所有测试都通过了,实际应用程序在 运行 手动时也能正常工作。
编辑:此解决方法现在导致问题,因此我不得不取消接受我的回答。原因是因为当我为结果调用另一个 Activity 时,当它返回时,监听器在 onResume 中被杀死。在这种情况下,onDestroy 还没有被杀死,所以不会导致这个问题。
编辑 2 和当前解决方案:这个问题对读者来说有点难以测试,所以我创建了一个测试应用程序和一个新的更简单的问题。从那以后,我找到了一个我在 post 中解释过的有效解决方案:
我相信基于阅读一些元问答,SO 更喜欢不删除问题,所以我将把这个问题留在这里。
在使用参数化测试时,Espresso 运行s 在第一次测试后的测试方式有什么不同吗?
我有两个参数,它们都 运行 如果我自己做它们就好了(如果我注释掉其中一个并且只有一个参数),或者如果我颠倒第一个的顺序总是过去。
但出于某种原因,当我 运行 将它们放在一起时,第二个总是失败。实际上,有一次它没有失败。在不改变任何东西的情况下,它工作了一次。但只有一次。所以可能存在错误,但我倾向于认为这是我正在做(或没有做)的事情。
实际发生的问题是一个字段在测试中途被设置为空(根据调试器)。但我似乎无法弄清楚如何或为什么,特别是因为它不会在第一次测试中发生。所以我在代码中找不到任何明显的东西,但我也看不出 Espresso 有什么不同。有什么想法吗?
我跟踪了调试器,它向我证明了该值已设置,然后出于某种原因,当它暂停当前 Activity 以启动对话框时,该值被设置为 null。但仅限于第二次测试。在第一次测试的这种完全相同的情况下,它不会那样做。为什么?
编辑: 好的,我已经进一步缩小了范围,但仍然不确定为什么要这样做。这有点奇怪,但我通过调试器发现,第一次测试中的 onDetach 在第二次测试中被称为 after onResume。为什么会这样?
无论如何,这绝对是我遇到问题的原因,因为使值变为 null 的代码源自 onDetach,而该值最初是从 onResume 中的方法设置的。所以这解释了它。但为什么会这样?
此处记录的问题:https://code.google.com/p/android/issues/detail?id=235247
好的,我找到了解决方案。由于在当前测试中 onResume 之后调用了先前测试的 onDestroy,因此我将 onDestroy 中用于清除监听器的代码移至 onResume 的开头。现在,当 onResume 中的其他代码运行时,它不会因 onDestroy 的错误时机而失效。监听器通过存储库访问,该存储库始终保持活动状态。
希望这一切对阅读的任何人都有意义,以防他们遇到类似的问题。到目前为止,我还没有注意到此解决方法的任何副作用。所有测试都通过了,实际应用程序在 运行 手动时也能正常工作。
编辑:此解决方法现在导致问题,因此我不得不取消接受我的回答。原因是因为当我为结果调用另一个 Activity 时,当它返回时,监听器在 onResume 中被杀死。在这种情况下,onDestroy 还没有被杀死,所以不会导致这个问题。
编辑 2 和当前解决方案:这个问题对读者来说有点难以测试,所以我创建了一个测试应用程序和一个新的更简单的问题。从那以后,我找到了一个我在 post 中解释过的有效解决方案:
我相信基于阅读一些元问答,SO 更喜欢不删除问题,所以我将把这个问题留在这里。