Skip to content

JUnit 自定义 Application

概述

  在编写 Android 单元测试时,有时需要自定 Application,用于做相关测试。为了达到这个效果,可以参考以下步骤。

步骤

添加自定义 Application

  在 androidTest 目录下,声明自定义 JUnitApplication 类。

kotlin
import android.app.Application
import android.content.Context
import androidx.multidex.MultiDex

/**
 * 测试应用
 *
 * @author Alan Yeh
 * @since 2023/02/14
 */
class JUnitApplication : Application() {
    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        // dex 分包
        MultiDex.install(base)
    }
}

声明 JUnitRunner

  新建 JUnitRunner 类,通过该类可以让测试环境在启动时使用开发者指定的 Application 类。

kotlin
import android.app.Application
import android.content.Context
import androidx.test.runner.AndroidJUnitRunner

/**
 * 自定义 JUnitRunner
 *
 * @author Alan Yeh
 * @since 2022/10/16
 */
class JUnitRunner: AndroidJUnitRunner() {

    /**
     * 使用自定用的 Application
     */
    override fun newApplication(cl: ClassLoader?, className: String?, context: Context?): Application {
        return super.newApplication(cl, JUnitApplication::class.java.name, context)
    }
}

修改 build.gradle 文件

  修改 testInstrumentationRunner 的值,指定通过上面的 JUnitRunner 来启动测试环境。

groovy
android {
    ...

    defaultConfig {
        ...

        // 指定通过自定义 JUnitRunner 来启动测试环境
        testInstrumentationRunner "central.test.JUnitRunner"
    }
    ...

    testOptions {
        unitTests {
            isIncludeAndroidResources true
        }
    }
}

运行测试用例

  完成以上步骤之后,就可以开始执行测试用例了。在 JUnitApplication 的 attachBaseContext 方法中添加断点,可以发现开发环境已经通过 JUnitApplication 来启动环境了。

  在测试用列中,也可以通过 ApplicationProvider.getApplicationContext<Application>() 来获取 application 实例。

kotlin
@SmallTest
@RunWith(AndroidJUnit4::class)
class TestInstantiation {

    @Test
    fun case1() {
        // 获取应用对象
        val application = ApplicationProvider.getApplicationContext<Application>()
    }

}

Released under the MIT license.