Android 集成Robolectric下的一些坑

来源:互联网 发布:自己怎么做淘宝优惠券 编辑:程序博客网 时间:2024/06/15 05:29

Robolectric的使用的一些坑

Robolectric可以非常方便的模拟Android环境进行单元测试,JUnit只能进行java的单元测试,所以对于想要非真机或者模拟器测试便衍生出来了Robolectric

Github:https://github.com/robolectric/robolectric

集成方式:

添加依赖 :

testCompile 'org.robolectric:robolectric:3.3.2'

在测试包中创建测试类:

@RunWith(RobolectricTestRunner.class)//指定测试环境@Config(constants = BuildConfig.class)// Android环境下必须指定该内容,非Android即可public class WelcomeActivityTest {    private ActivityController<WelcomeActivity> activityController;    private WelcomeActivity homeScreenActivity;    @Before    public void setup() {        ActivityLifecycleAnalyzer.setEnabled(false);        activityController = Robolectric.buildActivity(WelcomeActivity.class).create().start().resume().visible();        homeScreenActivity = activityController.get();        homeScreenActivity.findViewById(R.id.btn_welcome_started).performClick();        System.out.println(ShadowToast.getTextOfLatestToast());    }    @Test    public void checkActivityCreated() {        assertNotNull(homeScreenActivity);    }    @After    public void tearDown() {        activityController.pause().stop().destroy();    }}

上述注解中@Config中可以配置:
- pakcage
- sdk
- manifest
- 等等…

这样就可以进行单元测试了;

坑1:

当Robolectric遇到MultiDex

因为Android方法不能超过65535的限制,所以可以使用MulitDex进行拆分;但是Robolectric是通过反射去调用的目标Activity,所以会导致找不到资源;
解决办法:

    testCompile 'org.robolectric:shadows-support-v4:3.3.2'    testCompile 'org.robolectric:shadows-multidex:3.3.2'    testCompile 'org.khronos:opengl-api:gl1.1-android-2.1_r1'

坑2:

当Robolectric遇到leakcanary

因为Leackcanary是在Activity生命周期中插桩,导致与死循环,单元测试永无止境的执行下去;
解决办法:

 ActivityLifecycleAnalyzer.setEnabled(false);        activityController = Robolectric.buildActivity(WelcomeActivity.class).create().start().resume().visible();//在需要buildActivity/SetupActivity前将Leakcanary给enabled

如果在Application中初始化过Leakcanary,需要判断如下:

AndroidDevMetrics.Builder builder = new AndroidDevMetrics.Builder(this)                    .enableActivityMetrics(!isRoboUnitTest())//判断是否可以开启,防止与Roboblectric死循环;                    .enableDagger2Metrics(false)                    .showNotification(true);            AndroidDevMetrics.initWith(builder);

判断代码如下:

    /**     * current is RoboUnitTest?     *     * @return true or false     */    public static boolean isRoboUnitTest() {        return "robolectric".equals(Build.FINGERPRINT);    }

总结

因为单元测试用的比较少,但是为了规范代码且快速改Bug和迭代的话,单元测试是非常好的在后期开发中.记录一下这些坑,以便能帮助大家,因为官网都比较简单,网上大致都是翻译的官网;

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 南充住房公积金查询个人账户 住房公积金电话号码 银川住房公积金查询 淮南住房公积金查询个人账户 毕节住房公积金查询 邯郸市住房公积金管理中心 渭南市住房公积金管理中心 连云港住房公积金 临沂住房公积金查询个人账户 南充住房公积金 住房公积金密码 运城住房公积金查询 住房公积金查询电话 住房公积金热线 昆明市住房公积金管理中心 乌鲁木齐住房公积金查询 玉林市住房公积金管理中心 南宁住房公积金网 宜宾市住房公积金管理中心 重庆住房公积金 银川住房公积金查询个人账户 洛阳住房公积金查询 住房公积金卡 东莞住房公积金查询 南京住房公积金管理中心 成都住房公积金 广西住房公积金查询 广西区直住房公积金查询入口 哈尔滨住房公积金管理中心 武汉住房公积金查询个人账户 重庆市住房公积金管理中心 渭南住房公积金查询 咸阳市住房公积金管理中心 宁德住房公积金查询 苏州住房公积金管理中心 太原住房公积金 萍乡市住房公积金个人查询 深圳住房公积金查询余额 长春市住房公积金网 潍坊市住房公积金管理中心 阜阳市住房公积金查询