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

发布于:2025-03-01 ⋅ 阅读:(97) ⋅ 点赞:(0)

一、前言

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. 构建本地单元测试

网站公告

今日签到

点亮在社区的每一天
去签到