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