为什么Android Studio运行单元测试时会编译整个应用?
运行纯JVM单元测试触发全应用编译的问题
默认场景下该行为属于Gradle+Android Studio的默认预期逻辑:
- 你从侧边栏菜单点击单个测试项运行时,Android Studio默认会在运行测试前执行全局的
assemble构建任务,该任务会编译当前模块的所有生产代码,因此即使你只运行一个无Android依赖的简单单元测试,也会触发全量编译。 - 你可以通过修改运行配置优化该流程:打开右上角运行配置下拉菜单 -> 选择「Edit Configurations」-> 找到对应单元测试的配置项 -> 删掉「Before launch」栏默认的「Gradle-aware Make」任务,新增对应模块的
compileDebugUnitTestSources任务即可,修改后运行测试只会编译单元测试涉及的代码和依赖,不会触发全应用编译。
单元测试可引用Android框架类的问题
网上所说的「依赖Android库的单元测试无法运行」是有前提的,你遇到的现象属于正常情况:
- 放在
test/目录下的纯JVM单元测试默认会依赖Android官方提供的Mock Android Jar包,该包内所有Android框架类(比如Application、AppCompatActivity)都只有空实现,仅保留类结构,所有方法默认返回对应类型的默认值。 - 只要你没有调用这些Android类的方法、或者调用前已经用Mockito等工具对方法做了Mock,测试就可以正常运行。只有当你直接调用了未Mock的Android框架类方法时,才会抛出
Method not mocked的运行时异常,这也是大家常说的「纯JVM单元测试不能直接运行Android相关代码」的真实含义。
内容的提问来源于stack exchange,提问作者soshial
相关产品推荐
相关产品推荐

