Android简单插桩测试运行失败:Dagger注入无法识别自定义MyApplication
你遇到的报错是因为Android插桩测试默认会使用系统自带的android.app.Application类启动测试环境,不会自动加载你项目中实现了HasAndroidInjector接口的MyApplication类,导致Dagger注入时找不到对应实现,以下是两种可行的配置方案:
配置方案
方案1:全局指定测试使用的自定义Application(推荐,所有测试统一生效)
- 在
androidTest代码目录下创建自定义测试运行器类:
import android.app.Application import android.content.Context import androidx.test.runner.AndroidJUnitRunner // 替换为你自己的MyApplication全类名 import com.your.packagename.MyApplication class CustomTestRunner : AndroidJUnitRunner() { override fun newApplication( cl: ClassLoader?, className: String?, context: Context? ): Application { return super.newApplication(cl, MyApplication::class.java.name, context) } }
- 修改模块级
build.gradle(app目录下)的配置,指定测试运行器:
android { defaultConfig { // 原有其他配置保留 // 替换为你刚才创建的CustomTestRunner的全类名 testInstrumentationRunner "com.your.packagename.CustomTestRunner" } }
- 同步Gradle配置后重新运行测试即可。
方案2:针对单个测试单独配置
如果不想全局修改测试配置,仅需要给单个测试用例使用自定义Application,可以通过ActivityScenario的启动参数调整:
@RunWith(AndroidJUnit4::class) class MainActivityTest{ @Test fun test_openPage() { val context = ApplicationProvider.getApplicationContext<Context>() val intent = Intent(context, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } val activityScenario = ActivityScenario.launch<MainActivity>(intent) // 后续测试逻辑 } }
注意:确保你项目主
AndroidManifest.xml的<application>标签已经配置了android:name=".MyApplication",测试环境会默认继承主Manifest的配置,除非你单独创建了测试用的Manifest覆盖了该属性。
内容的提问来源于stack exchange,提问作者Egemen Hamutçu
相关产品推荐
相关产品推荐

