Robolectric基础篇

因公司需求,需要学习Robolectric测试框架,在网上找了很久,发现真的没有那么多的人写单元测试,关于Robolectric的资料真的很少,找到的资料,多多少少都有些问题,东拼西凑下才完成了Robolectric的搭建和测试

环境的配置

AS的要求

Android studio 版本大于等于3.0(我的AS为3.1.2)

配置须知

  1. 导包
//目前最新为3.8
testImplementation 'org.robolectric:robolectric:3.8'
//新建Android项目,会自动生成 junit 包
testImplementation 'junit:junit:4.12'
  1. 最容易遗漏的一步
android {
//这一步不弄,不能运行起来
    testOptions {
        unitTests {
            includeAndroidResources = true
        }
    }
}

简单的测试

代码的位置

  • 在左侧的project中选择Android结构,然后打开Java的文件夹,可以发现里面有三种package,一个是写源码的,一个是Androidtest,还有一个是test,我们的相关测试代码就是写在test中的,例如:
//注意:
//1.constants = BuildConfig.class不加,会找不到资源文件
//2.最新版本的Robolectric不支持api为28的
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class,sdk = 26)
public class LoginActivityTest {
}

activity的测试

//测试的方法前面,一定要加@Test的注释
@Test
public void testActivity(){
    LoginActivity loginActivity = Robolectric.setupActivity(LoginActivity.class);
    Assert.assertNotNull(loginActivity);
}
  • 这段代码主要是测试loginActivity是否存在的

Robolectric测试网络接口

  • 所有写Android的应该都知道,APP离不开接口,如果Robolectric无法测试接口,Robolectric就有一种鸡肋的感觉。所以类似之前的测试activity,这些简单的,网上都能查到,就直接说测试网络接口吧
//一个很关键的地方,网络请求一定要同步,不要异步,异步会没有结果的
@Test
public void testApi() {
    OkHttpClient okHttpClient = new OkHttpClient();
    Request request = new Request.Builder().url("http://api.tianapi.com/txapi/joke/?key=16afba68fae446b745e1545dace00bf2").build();
    Call call = okHttpClient.newCall(request);
    try {
        String result = call.execute().body().string();
        Assert.assertEquals("success1",result);
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  • 这里的网络请求用的是OkHttp,所以需要去导包,GitHub上可以找到最新的。至于api,作为Android开发,找个免费的api,应该还是很容易的,测试网络接口是不是也很简单。

Robolectric踩过的4大坑

  • 因为网上的资源实在稀少,所以踩得坑只能慢慢的一个一个的填了
  1. java.lang.NullPointerException 这个主要是配置问题
android {
//这一步不弄,不能运行起来
    testOptions {
        unitTests {
            includeAndroidResources = true
        }
    }
}
  1. Could not find any resource from reference ResName 找不到资源文件,需要添加constants = BuildConfig.class
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class,sdk = 26)
public class LoginActivityTest {
}
  1. java.lang.RuntimeException: MultiDex installation failed 如果把Robolectric引入到公司的内部框架里面,遇到了这个错,是因为缺包,需要再导一个包
testImplementation 'org.robolectric:shadows-multidex:3.8'
  1. 无法识别TextUtils中的一些方法
  • 需要我们新建TextUtils类,在test中建一个package,package的名字是android.text,在android.text新建TextUtils类,例如:
//注意了,这个也是在test里面
package android.text;

public class TextUtils {
    public static boolean isEmpty(CharSequence str) {
        if (str == null || str.equals("")) {
            return true;
        }
        return false;
    }
}

这应该是目前为止是关于Robolectric最新的文章了,希望能对你们有帮助。

新增,命令行执行

  1. 进入AS里面的Terminal
  2. 输入命令
// 测试所有的test
gradlew test
// 单个指定测试
gradlew testDebug --tests="*.testApi"

关注我的技术公众号,每个工作日都有优质技术文章推送。
微信扫一扫下方二维码即可关注:
图片

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值