测试期间如何忽略FirebasePerf的@AddTrace注解?
测试时忽略@AddTrace注解的实用方案
方法1:通过系统属性禁用Firebase Performance instrumentation
直接在测试初始化阶段设置系统属性,让Firebase Perf跳过注解的 Instrumentation 逻辑:
@Before fun setUp() { System.setProperty("firebase.performance.disableInstrumentation", "true") }
如果用Robolectric,也可以直接在测试类配置里加:
@RunWith(RobolectricTestRunner::class) @Config(systemProperties = ["firebase.performance.disableInstrumentation=true"]) class CustomerRepoTest { // 测试代码 }
方法2:Mock FirebasePerformance核心实例
如果你的类是通过依赖注入获取FirebasePerformance,直接给测试传一个空实现的Mock:
// 业务类构造注入FirebasePerformance class CustomerRepository(private val firebasePerf: FirebasePerformance) { @AddTrace(name = "getCustomers") override suspend fun getCustomers(isDeleted: Boolean): List<Customer> {} } // 测试类中用Mockk/Mockito创建空Mock val mockPerf = mockk<FirebasePerformance>(relaxed = true) val repo = CustomerRepository(mockPerf)
如果是通过静态方法FirebasePerformance.getInstance()获取,就Mock静态方法:
@Before fun setUp() { mockkStatic(FirebasePerformance::class) every { FirebasePerformance.getInstance() } returns mockk(relaxed = true) }
方法3:Gradle配置中关闭测试环境的Perf instrumentation
直接在构建脚本里给测试变体禁用Firebase Perf的注解处理,从根源上避免注解生效:
// Groovy DSL android { buildTypes { test { firebasePerformance { instrumentationEnabled = false } } } }
如果用Kotlin DSL:
android { buildTypes { test { firebasePerformance { isInstrumentationEnabled = false } } } }
方法4:自定义TestRule统一处理
写一个TestRule,在测试前后自动开关Perf禁用属性,不用每个测试类重复写:
class DisableFirebasePerfRule : TestRule { override fun apply(base: Statement, description: Description): Statement { return object : Statement() { override fun evaluate() { val originalProp = System.getProperty("firebase.performance.disableInstrumentation") System.setProperty("firebase.performance.disableInstrumentation", "true") try { base.evaluate() } finally { originalProp?.let { System.setProperty("firebase.performance.disableInstrumentation", it) } } } } } } // 测试类中直接引用 @Rule @JvmField val disablePerfRule = DisableFirebasePerfRule()
内容的提问来源于stack exchange,提问作者ronnieotieno
相关产品推荐
相关产品推荐

