use*_*343 3 testing android assert android-intent robolectric
我的 Robolectric 单元测试遇到问题。
我可以毫无问题地断言,当侦听器使用该方法时,单击启动了一个新活动startActivity( Intent )
但当使用该方法启动新活动时,Robolectric 似乎遇到了麻烦startActivityForResult(Intent, int):在代码中进行一些中断让我发现该活动尚未启动(只需更改方法即可startActivity( Intent )使断言通过)。
这正常吗?遗憾的是,因为我的应用程序的第一个 Activity 使用startActivityForResult(Intent, int).
有人成功通过这种启动活动的方式进行测试吗?
感谢您的帮助 ..
对您问题的简短回答是,由于 Robolectric 将 Android 类转换为在 JVM 中执行的代码的方式,它们的许多功能并不像您期望的那样运行。许多系统回调不会执行,您必须依赖 Robolectric 在其 Shadow 类实现中提供的内容。(请参阅@Steven_BDawg 提供的链接)。
长答案:也许可以在一次大型测试中实现整个流程,但这不是框架的设计目的。
Robolectric 和单元测试一般并不意味着按照您描述的方式使用。 维基百科上的单元测试页面指出,人们可以将单元视为应用程序的最小可测试部分。单元测试套件应包含许多轻量级测试,其中每个测试隔离应用程序中的一些功能并确保其正常工作。
考虑一个包含两个活动 A 和 B 的基本应用程序。活动 A 显示有关某个主题的一些信息,活动 B 允许用户选择在 A 中显示哪个主题。当用户从活动 A 移动到活动 B 时,B 会获取调用startActivityForResult()和 应该返回到 A 并选择主题。
现在假设我们要对 A 从 B 获取结果并显示数据的流程进行单元测试。我们可以将其分为两个测试:
receiveResult()A 的影子方法,填写结果代码为 OK 和此 Intent 的参数。之后receiveResult(),运行您的断言。您现在知道 Activity A 正确处理结果了!这是一个非常简单的例子。这两个步骤可能会分解为更多的测试,因为每个单元测试应该只测试应用程序可以分解的最小功能单元。该示例主要是为了帮助您开始以单元测试的方式进行思考。我发现随着我对单元测试理解的加深,我编写代码的方式也发生了变化。我尽量避免以这样的方式编写方法和类,因为它们会做太多工作并且无法进行正确的单元测试。根据经验,易于进行单元测试的代码会执行非常具体的操作,这些操作在第一次阅读代码时很容易看出。
最后,如果您想更进一步,模拟框架可以极大地帮助您进行单元测试。 Mockito是一个模拟框架,我过去曾成功使用过。模拟框架的目的是创建存根对象,其行为由您严格控制。Mockito(或任何其他模拟框架)将允许您定义一个从您需要的任何类型扩展的对象,并且仅实现您需要的方法。您将能够直接控制对任何这些方法调用的响应。这有助于单元测试,因为您需要的唯一真实对象是被测对象;通过模拟所有其他对象,您将更好地了解被测对象是否行为正常,因为所有其他行为都是由您(测试人员)显式定义的。(是的,这确实会导致大量额外的代码,但这就是一个优秀的单元测试人员的生活。但是,如前所述,随着您对单元测试越来越熟悉,您可能会发现自己编写的方法需要更少的模拟和更有利于编写测试。一些程序员甚至会在编码之前编写单元测试,以保持代码紧凑并专注于单一目的)
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
5630 次 |
| 最近记录: |