【问题标题】:Difference between a stub, a mockito "mock" class, and a Robolectric "shadow" object存根、模拟“模拟”类和 Robolectric“影子”对象之间的区别
【发布时间】:2015-09-08 01:28:13
【问题描述】:
这些显然是相关的并且有一些相似之处,但我不确定是什么让它们与众不同。在 robolectric 文档中,强调 Shadow Classes 不是 Mock 或 Stub 类。这些有何不同,如何使用?
注意:我认为在这种情况下,一个实际示例(“您将使用模拟类来测试某某,由于某某而您无法使用影子类进行测试”)超过简单的概述将特别有用和说明性。
【问题讨论】:
标签:
android
mockito
robolectric
stubs
【解决方案1】:
为MyActivity 类考虑一个简单的单元测试,您将不会使用Robolectric.setupActivity。你编写一个测试用例,调用MyActivity.onCreate 来检查调用时是否完成了一些预初始化。这个测试用例将在super.onCreate 调用失败,这是由android系统强制的。
Mock 无济于事,因为您不使用可被模拟的成员变量。
Stub 将无济于事,因为您可以为您的活动存根 onCreate 方法的继承,这使得测试毫无意义。
您想念Spy,但这也无济于事,因为继承。使用 Spy 可以避免像存根这样的真正 onCreate 调用,但也使测试变得毫无意义。
Shadow 可以在这种情况下提供帮助。这更像是一个代理。每个继承的类都可以有一个显式代理。它也可以拦截静态方法的每种类型的方法调用。举个例子,我们可以为android.app.Activity 创建一个代理,它会影响 onCreate 方法,而不是抛出异常,它什么也不做……你可以保存这个事件,以便以后检查这个 super.method 是否被调用必要时的预期参数;)