这些显然是相关的并且有一些相似之处,但我不确定是什么让它们与众不同。在 robolectric 文档中,强调Shadow Classes 不是 Mock 或 Stub 类。这些有何不同,如何使用?
注意:我认为在这种情况下,一个实际的示例(“您将使用模拟类来测试某某,由于某某而您无法使用影子类进行测试”)不仅仅是一个概述将特别有用和说明性。
这些显然是相关的并且有一些相似之处,但我不确定是什么让它们与众不同。在 robolectric 文档中,强调Shadow Classes 不是 Mock 或 Stub 类。这些有何不同,如何使用?
注意:我认为在这种情况下,一个实际的示例(“您将使用模拟类来测试某某,由于某某而您无法使用影子类进行测试”)不仅仅是一个概述将特别有用和说明性。
MyActivity
考虑一个您不会使用的类的简单单元测试Robolectric.setupActivity
。您编写一个测试用例,在其中调用MyActivity.onCreate
以检查调用时是否完成了一些预初始化。此测试用例将在super.onCreate
由 android 系统强制调用时失败。
Mock
将无济于事,因为您不使用可以模拟的成员变量。
AStub
无济于事,因为您可以为您的活动存根 onCreate 方法的继承,这使得测试毫无意义。
你错过了Spy
,但这也无济于事,因为继承。使用 Spy 可以避免像存根这样的真正的 onCreate 调用,但也使测试变得毫无意义。
在这种Shadow
情况下可以提供帮助。这更像是一个代理。每个继承的类都可以有一个显式代理。它也可以拦截静态方法的每种类型的方法调用。举个例子,我们可以为它创建一个代理,android.app.Activity
它会影响 onCreate 方法,而不是抛出异常,它不会做任何事情......在那里你可以保存这个事件,这样你以后可以检查这个 super.method 是否使用预期的参数被调用,如果必要的 ;)