Robolectric之Shadows

官网介绍地址:点这里
本文根据自己平时的使用对官网文档的一种理解

shadows出现的原因

Robolectric虽然创建了一个包含了真实的Android框架代码的运行时环境,但是还是有一些限制:

  1. Native code - Android native code cannot execute on your development machine. (Android本地代码不能在我们的开发计算机上执行)
  2. Out of process calls - There are no Android system services running on your development machine.(我们的开发计算机上没有跑Android系统服务)
  3. Inadequate testing APIs - Android includes next to no APIs suitable for testing.(Android没有可以用于测试的API)

为了解决以上问题,就有了shadows。每一个shadow都可以修改或扩展Android系统中相应的类。每当Android实例化一个类时,Robolectric就会找到他相应的shadow类,然后给他们之间建立联系

自定义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方法在所有的类中都生效

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值