文章目錄
- 一、前言
- 二、簡單示例
- 三、參考文檔
一、前言
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()@Testfun clickingLogin_shouldStartLoginActivity() {Robolectric.buildActivity(MaterialTestActivity::class.java).use { controller ->controller.setup() // Moves the Activity to the RESUMED stateval activity = controller.get()activity.findViewById<Button>(R.id.button).performClick()val expectedIntent = Intent(activity, PaintedScrollActivity::class.java)val actual = shadowOf(RuntimeEnvironment.getApplication()).nextStartedActivityprintln("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@JvmFieldval executorRule = InstantTaskExecutorRule()
不過@Config
也需要添加版本
@Config(sdk = [28])
三、參考文檔
- Robolectric 策略
- robolectric
- 構建本地單元測試