完全自定义阴影对象如何在Robolectric中工作?

kan*_*eda 12 android unit-testing robolectric

如果我为我的Activity编写一个自定义Shadow,并使用RobolectricTestRunner注册它,那么框架是否会在我的自定义Shadow启动时拦截Activity?

谢谢.

小智 11

最简洁的答案是不.

Robolectric选择拦截哪些类和乐器.在撰写本文时,将要检测的唯一类必须具有与这些选择器之一匹配的完全限定类名:

android.* 
com.google.android.maps.* 
org.apache.http.impl.client.DefaultRequestDirector
Run Code Online (Sandbox Code Playgroud)

Robolectric存在的全部原因是Android SDK jar中提供的类在JVM中调用时会抛出异常(即不在模拟器或设备上).您的应用程序的Activity具有非"敌对"的源(在调用方法或构造函数时,它可能不会抛出异常).Robolectric的目的是允许您对应用程序的代码进行测试,否则由于SDK的编写方式而无法实现.Robolectric创建的其他一些原因是:

  • SDK并不总是具有允许您查询应用程序代码操纵的Android对象状态的方法.可以编写阴影以提供对此状态的访问.
  • Android SDK中的许多类和方法都是最终的和/或私有的或受保护的,这使得很难创建应用程序代码所需的依赖项,否则这些依赖项将可用于您的应用程序代码.

可以清楚地将代码更改为遮蔽任何类.过去一直在谈论将阴影特征提取到一个独立的库中,以帮助使用其他一些测试恶意api编写测试.

你为什么想影响你的活动?


Ber*_*d S 9

使用Robolectric 2可以显着改变.您可以在配置中指定自定义阴影,而不是编写自己的TestRunner.

例如:

@Config(shadows = {ShadowAudioManager.class, ShadowContextWrapper.class})
Run Code Online (Sandbox Code Playgroud)