单元测试中如何跳过含WorkManager的代码?无法修改项目代码
解决WorkManager初始化错误并覆盖目标代码的测试方案
由于无法修改项目源码,我们需要通过静态Mock拦截ClasWithWorkManager伴生对象的veryVeryBadFunc调用,避免触发WorkManager初始化逻辑,从而执行funToBeTested()的后续代码并完成覆盖。以下是两种可行的测试实现方案:
方案一:使用Mockito-inline(推荐)
Mockito-inline支持直接Mock静态方法,无需额外复杂配置:
- 确保测试模块依赖中引入Mockito-inline(仅需修改测试相关配置,不属于项目代码修改):
// build.gradle (Module level) testImplementation 'org.mockito:mockito-inline:4.11.0' testImplementation 'org.mockito:mockito-core:4.11.0'
- 编写测试用例:
import org.junit.Test import org.mockito.Mockito.anyString import org.mockito.Mockito.mockStatic class FunToBeTestedTest { @Test fun testFunToBeTested() { // 静态Mock ClasWithWorkManager类,拦截所有静态方法调用 mockStatic(ClasWithWorkManager::class.java).use { mockedStatic -> // 指定veryVeryBadFunc调用时不执行原有逻辑 mockedStatic.`when` { ClasWithWorkManager.veryVeryBadFunc(anyString()) }.thenAnswer {} // 执行待测试函数 funToBeTested() // 此处添加后续业务逻辑的断言,验证代码执行结果 } } }
方案二:使用PowerMock(兼容旧项目)
如果项目使用较旧的测试框架,可通过PowerMock实现静态Mock:
- 引入PowerMock依赖:
// build.gradle (Module level) testImplementation 'org.powermock:powermock-module-junit4:2.0.9' testImplementation 'org.powermock:powermock-api-mockito2:2.0.9'
- 编写测试用例:
import org.junit.Test import org.junit.runner.RunWith import org.powermock.api.mockito.PowerMockito import org.powermock.core.classloader.annotations.PrepareForTest import org.powermock.modules.junit4.PowerMockRunner import org.mockito.Mockito.anyString @RunWith(PowerMockRunner::class) @PrepareForTest(ClasWithWorkManager::class) class FunToBeTestedTest { @Test fun testFunToBeTested() { // 初始化静态Mock PowerMockito.mockStatic(ClasWithWorkManager::class.java) // 让veryVeryBadFunc调用时无实际操作 PowerMockito.doNothing().`when`(ClasWithWorkManager::class.java) ClasWithWorkManager.veryVeryBadFunc(anyString()) // 执行待测试函数 funToBeTested() // 添加后续逻辑的断言验证 } }
关键说明
- 上述测试均为本地单元测试(放在
src/test目录),无需依赖Android设备或模拟器,符合后续逻辑无Android类引用的场景。 - 核心思路是拦截
veryVeryBadFunc的静态调用,跳过其内部WorkManager相关操作,避免触发初始化错误,确保后续代码正常执行并被测试覆盖。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

