集成Robolectric做单元测试(1)

2019-10-18  本文已影响0人  Magic旭

背景

  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来模拟接口拉去数据情况。等我后续理解跟深入一定会再出一期。
上一篇下一篇

猜你喜欢

热点阅读