存根、mockito "mock" class 和 Robolectric "shadow" 对象之间的区别

Difference between a stub, a mockito "mock" class, and a Robolectric "shadow" object

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

注意:我认为在这种情况下,一个实际示例 ("you would use a mock class to test such-and-such, which you could not test with a shadow class because of such-and-such") 而不是简单的概述会特别有用和说明性。

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

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

A Stub 由于继承而无济于事,您可以为您存根 onCreate 方法 activity 这使得测试毫无意义。

您错过了 Spy 但这也无济于事,因为继承。使用 Spy 可以避免像存根这样的真正的 onCreate 调用,但也使测试变得毫无意义。

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