美文网首页
集成Robolectric做单元测试(1)

集成Robolectric做单元测试(1)

作者: Magic旭 | 来源:发表于2019-10-18 19:15 被阅读0次

    背景

    1. 早期Junit 和Instrumentation能进行简单的单元测试,如果想进行复杂的UI与接口测试就难以用两者去实现了,这里介绍Robolectric快速集成测试用法。

    Robolectric

    1. Robolectric优点:(1). 自身api支持复杂场景的使用;(2). 相对其他测试框架速度较快。
    2. Robolectric API文档:http://robolectric.org/javadoc/latest/
    3. Robolectric官网:http://robolectric.org/blog/2018/10/25/robolectric-4-0/
    Robolectric接入流程

    以下都是引用官网的,这里介绍只是为了方便没有梯子的同学

    1. 在你项目app/build.gradle下添加Roboletric依赖
    android {
      //下面这个必须要,要不运行起来会提示找不到资源文件的错
      testOptions {
        unitTests {
          includeAndroidResources = true
        }
      }
    }
    
    dependencies {
     //这里的版本要以官网最新的为准,我刚开始接入的时候用旧版本就报mainfest.xml找不到的错误,然后google找了一圈解决办法都没办法解决。后面用了官网最新版本就可以了
      testImplementation 'org.robolectric:robolectric:4.3'
    }
    
    1. 如果你的androidstudio的版本低于3.3,请在gradle.properties文件添加下面一句话
      android.enableUnitTestBinaryResources=true

    Robolectric实战

    模拟代码的Activity跳转
    1. 首先在ActivityA给一个控件绑定一个Click事件,然后就是new一个Intent。(Kotlin劝退)
    override fun init() {
            image = findViewById(R.id.image)
            image!!.setOnClickListener {
                val intent = Intent(this, TestActivity::class.java)
                this.startActivity(intent)
            }
        }
    
    1. 回到我们的单元测试中,我们要验证ActivityA中是否正确跳转到ActivityB了,这时候肯定需要一个ActivityA的实例化对象。
    @RunWith(RobolectricTestRunner::class)
    @Config(
        application = android.app.Application::class,
        sdk = [21]
    )
    class ExampleUtilsTest {
            @Test
        fun startActivity() {
            //获取实例
            val activityA = Robolectric.setupActivity(MainActivity::class.java)
            //找到控件,模拟点击
            activityA.findViewById<ImageView>(R.id.image).performClick()
            //创建理想化的intent,用来做对比
            val expectIntent = Intent(activityA, ActivityB::class.java)
            //封装成ShadowActivity,这样子才能拿到里面的参数
            val activityAA = Shadows.shadowOf(activityA)
           //获取ActivityA的跳转intent
            val actualIntent = activityAA.nextStartedActivity
            //比较两个intent的落地页是不是都是同个类
            Assert.assertEquals(expectIntent.component, actualIntent.component)
        }
    }
    
    1. 如果把上面的ActivityB改成ActivityC,这段单元测试就会跑不过了。多动起手来尝试下。

    后续

    1. 后续打算总结下,用Robolectric来模拟接口拉去数据情况。等我后续理解跟深入一定会再出一期。

    相关文章

      网友评论

          本文标题:集成Robolectric做单元测试(1)

          本文链接:https://www.haomeiwen.com/subject/wkdwmctx.html