因公司需求,需要学习Robolectric测试框架,在网上找了很久,发现真的没有那么多的人写单元测试,关于Robolectric的资料真的很少,找到的资料,多多少少都有些问题,东拼西凑下才完成了Robolectric的搭建和测试
环境的配置
AS的要求
Android studio 版本大于等于3.0(我的AS为3.1.2)
配置须知
- 导包
//目前最新为3.8
testImplementation 'org.robolectric:robolectric:3.8'
//新建Android项目,会自动生成 junit 包
testImplementation 'junit:junit:4.12'
- 最容易遗漏的一步
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大坑
- 因为网上的资源实在稀少,所以踩得坑只能慢慢的一个一个的填了
- java.lang.NullPointerException 这个主要是配置问题
android {
//这一步不弄,不能运行起来
testOptions {
unitTests {
includeAndroidResources = true
}
}
}
- Could not find any resource from reference ResName 找不到资源文件,需要添加constants = BuildConfig.class
@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class,sdk = 26)
public class LoginActivityTest {
}
- java.lang.RuntimeException: MultiDex installation failed 如果把Robolectric引入到公司的内部框架里面,遇到了这个错,是因为缺包,需要再导一个包
testImplementation 'org.robolectric:shadows-multidex:3.8'
- 无法识别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最新的文章了,希望能对你们有帮助。
新增,命令行执行
- 进入AS里面的Terminal
- 输入命令
// 测试所有的test
gradlew test
// 单个指定测试
gradlew testDebug --tests="*.testApi"
关注我的技术公众号,每个工作日都有优质技术文章推送。
微信扫一扫下方二维码即可关注: