本文共 2172 字,大约阅读时间需要 7 分钟。
官网介绍地址:
本文根据自己平时的使用对官网文档的一种理解Robolectric虽然创建了一个包含了真实的Android框架代码的运行时环境,但是还是有一些限制:
为了解决以上问题,就有了shadows。每一个shadow都可以修改或扩展Android系统中相应的类。每当Android实例化一个类时,Robolectric就会找到他相应的shadow类,然后给他们之间建立联系
在自定义的shadow类上添加注解:@Implements(shadowClassName.class)
在shadow的那个方法上添加注解:@Implementation 比如我们有一个类是这样的public class Person { private String name; private int age; public String getName(String first, String second){ return first + second; } public int getAge(int age){ return age * 10; }}
我们要做这个类的shadow
@Implements(Person.class)public class PersonShadow { @Implementation public String getName(String first, String second){ return "hello world"; }}
在测试类中,添加配置@Config(shadows = {PersonShadow.class,MyOtherCustomShadow.class}"),此测试类中调用Person的getName方法时就会映射到PersonShadow的getName上,因为getAge没有shadow方法,还会调用Person的方法
Shadowing 构造方法:@Implements(TextView.class)public class ShadowTextView { ... @Implementation protected void __constructor__(Context context) { this.context = context; } ...
@RealObject的使用
@Implements(Point.class)public class ShadowPoint { @RealObject private Point realPoint; ... public void __constructor__(int x, int y) { realPoint.x = x; realPoint.y = y; }}
使用了此注解到就会映射为真实的类,而不是shadow类;但是此对象的方法被调用还是会被Robolectric拦截
1.在类上添加注解@Config(shadows = {PersonShadow.class,MyOtherCustomShadow.class}"),在单元测试中调用我们shadow的类的方法时就会走我们的shadow类
2.通过Shadows.shadowOf()获得类相应的shadow类(Robolectric实现了很多Android系统类的shadow类,在调用这些系统方法时,Robolectric会保证Shadow相应的方法会调用)Intent actualIntent = shadowOf(context).getNextStartedActivity(); Intent expectedIntent = new Intent(currentActivity, ExceptActivity.class); Assert.assertEquals(expectedIntent.getComponent(), actualIntent.getComponent());
用此方法来查看代码是否启动了正确的Activity
我们也可以配置让我们写的shadow方法在所有的类中都生效转载地址:http://furlf.baihongyu.com/