存根,模拟“模拟”类和Robolectric“阴影”对象之间的区别

时间:2015-06-22 14:30:55

标签: android mockito robolectric stubs

这些显然是相关的,并且有一些相似之处,但我不确定是什么让它们与众不同。在robolectric文档中,强调 Shadow Classes不是Mock或Stub类。这些有何不同,如何使用?

注意:在这种情况下,我认为,一个实际的例子(“你将使用模拟类测试这样的,你不能用影子类测试因为这样的”)简单地概述将是特别有用和说明性的。

1 个答案:

答案 0 :(得分:4)

考虑MyActivity类的简单单元测试,您不会使用Robolectric.setupActivity。您编写了一个测试用例,在其中调用MyActivity.onCreate来检查调用时是否已完成某些预初始化。这个测试用例将在android系统强制的super.onCreate调用时失败。

Mock无济于事,因为您没有使用可能被嘲笑的成员变量。

Stub无法帮助,因为继承可以为你的活动存根onCreate方法,这使得测试毫无意义。

你错过了Spy,但由于继承,这也无济于事。使用Spy可以避免真正的onCreate调用,例如存根,但也会使测试毫无意义。

Shadow可以帮助解决这种情况。这更像处理代理。每个继承的类都可以有一个显式代理。对于静态方法,它也可以拦截每种类型的方法调用。对于你的例子,我们可以为android.app.Activity创建一个代理,它将影响onCreate方法,而不是抛出异常,它什么都不做......你可以保存这个事件,以便稍后检查这个super.method是如有必要,使用预期参数调用;)