当前位置: 首页 > news >正文

Android中使用Robolectric测试点击事件(不需要手机)

文章目录

  • 一、前言
  • 二、简单示例
  • 三、参考文档

一、前言

Robolectric 是一个由 Google 维护的开源 Android 测试框架,它允许你以 Android 运行时环境运行单元测试。
Robolectric 提供了一个模拟 Android 运行时环境,允许你测试你的代码是否正确地使用 Android API。
所以在不依赖于手机的情况下可以对android项目进行测试。当然也可以在有手机的时候对Android项目进行测试

二、简单示例

以下代码源自官方文档,并进行简单完善。
文件位于src/app/test/下面

import android.content.Intent
import android.widget.Button
import com.example.myapplication.R
import com.example.myapplication.hilt.App
import com.example.myapplication.material.MaterialTestActivity
import com.example.myapplication.roll.PaintedScrollActivity
import junit.framework.TestCase.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
import org.robolectric.Shadows.shadowOf
import org.robolectric.annotation.Config

@RunWith(RobolectricTestRunner::class)
@Config(application = App::class, sdk = [28])
class RobolectricTest {

//    @get:Rule
//    @JvmField
//    val executorRule = InstantTaskExecutorRule()

    @Test
    fun clickingLogin_shouldStartLoginActivity() {
        Robolectric.buildActivity(MaterialTestActivity::class.java).use { controller ->
            controller.setup() // Moves the Activity to the RESUMED state
            val activity = controller.get()
            activity.findViewById<Button>(R.id.button).performClick()
            val expectedIntent = Intent(activity, PaintedScrollActivity::class.java)
            val actual = shadowOf(RuntimeEnvironment.getApplication()).nextStartedActivity
            println("YM----->,actual--> ${actual.component?.className}---->expectedIntent.name:${expectedIntent.component?.className}")
            assertEquals(expectedIntent.component, actual.component)
        }
    }

}

这里需要注意的是需要添加

@Config(application = App::class, sdk = [28])

其中App是应用的Application文件。否则会有各种问题,最主要是提示不是主线程的问题。如果没有Application的话,可以使用另外一种方式。这种方式需要添加如下依赖


    testImplementation "androidx.arch.core:core-testing:2.1.0"

然后添加以下代码

    @get:Rule
    @JvmField
    val executorRule = InstantTaskExecutorRule()

不过@Config也需要添加版本
@Config(sdk = [28])

三、参考文档

  1. Robolectric 策略
  2. robolectric
  3. 构建本地单元测试

相关文章:

  • 卷积神经网络(Convolutional Neural Network,CNN)详细解释(带示例)
  • MySQL 架构与 SQL 执行全流程解析
  • 数据库基础三(MySQL数据库操作)
  • ubuntu防火墙iptables
  • C大调中的A4=440Hz:音乐、物理与认知的交响
  • kubernetes 部署项目
  • 基于javaweb的SpringBoot在线动漫信息平台系统设计和实现(源码+文档+部署讲解)
  • Hive的内置函数
  • 【算法】图论 —— Floyd算法 python
  • Linux 动静态库和_make_进度条(一)
  • 通俗易懂,什么是cache一致性
  • Leetcode-853. Car Fleet [C++][Java]
  • Autosar RTE配置-Port Update配置及使用-基于ETAS工具
  • P8649 [蓝桥杯 2017 省 B] k 倍区间--前缀和--同余定理【蓝桥杯简单题-必开long long】
  • 基于ssm的校园跑腿管理系统+vue
  • 【练习】【贪心】力扣452. 用最少数量的箭引爆气球
  • Hutool - POI:让 Excel 与 Word 操作变得轻而易举
  • 2024年12月中国电子学会青少年软件编程(图形化)等级考试试卷(二级)答案 + 解析
  • C#上位机--关键字
  • 天锐绿盾软件,如何防止企业内部数据泄露?
  • 网站建设淘宝客/百度的网址怎么写
  • 网易企业邮箱手机上登录不了/营销推广seo
  • 做淘宝网站需要多大空间/济南百度竞价开户
  • 大连高新园区范围/seo外链工具软件
  • 网站建设上市公司/推广团队在哪里找
  • 中山网站建设价格低/nba最新消息新闻