2

我通过stackoverflow和google在一些代码中看到很多对ShadowApplication的引用,但我不知道它的作用。

我不知道我是否缺少一些文档资源,但我无法提供任何好的资源,javadoc api 也没有解释太多。

谁能提供有关 ShadowApplication 的更多信息,是否有更多资源,即培训、教程?

我敢肯定,除了 ShadowApplication 之外,我还缺少很多东西

4

2 回答 2

8

为了禁止在 JVM 而不是 Dalvik VM 中运行 android 代码,Google 剥离了 android.jar 文件中的类,并将其所有方法体替换为:

抛出新的 RuntimeException("Stub!");

一般来说,Robolectric 使用带有视图和资源加载的阴影对象来解决这个问题。

阴影对象如何工作?

  • Robolectric 拦截被测 Android 类的加载。
  • 重写 Android 类的方法体(使用 javassist)。
  • 将阴影对象绑定到新的 Android 对象。
  • 修改后的 Android 对象代理方法调用影子对象。
  • 阴影支持 Android 类。即 ShadowImageView 支持 ImageView 类。
  • 对 Android 对象的方法调用被代理到具有相同签名的影子对象的方法(如果存在)。
  • 提供基本行为的简单实现。
  • 状态被记录下来,因此可以在测试中进行验证。

查看此处的主题演讲和此 youtube 会话以了解更多详细信息。

于 2012-07-24T10:33:13.407 回答
0

我认为您应该查看Roboelectric的文档,看看它们是否解释了您不理解的概念。

从手册:

有时 Android 类不提供访问被测 Android 对象状态的方法。Robolectric.shadowOf() 方法提供对表示 Android 对象的影子实例的引用,允许测试断言在其他情况下不可用的状态。

当我查看 Roboelectric 的源代码并看到许多(如果不是全部)android 类的影子实现时,这对我来说很有意义,例如 Application(请参阅ShadowApplication)。

于 2012-07-24T10:01:20.253 回答