Android设备中androidTest目录下JUnit测试断言失败却通过问题咨询
为什么Instrumented测试里的
assert(false)没触发失败? 我碰到过不少开发者踩这个坑,这其实是Android Instrumented测试和本地单元测试的运行环境差异搞的鬼。
先看你用到的测试代码:
@RunWith(JUnit4::class) class Test { @Test fun test() { assert(false) } }
问题根源
- 本地单元测试(
test目录):运行在电脑的JVM上,Android Studio默认会给单元测试配置-ea参数(开启断言),所以JVM原生的assert关键字会正常工作,assert(false)直接触发断言失败,测试就按预期挂了。 - Instrumented测试(
androidTest目录):运行在设备/模拟器的ART虚拟机上,而ART默认是禁用断言功能的。这意味着assert(false)这句话相当于一句空代码,根本不会执行任何失败逻辑,测试自然就“顺利通过”了。
解决办法
在Instrumented测试里,别用JVM原生的assert,改用测试框架提供的断言方法——不管虚拟机有没有开断言,这些方法都会主动抛出异常标记测试失败。比如用JUnit或AndroidX Test的断言:
import org.junit.Assert.assertFalse @RunWith(JUnit4::class) class Test { @Test fun test() { // 可以带自定义失败提示,排查问题更清晰 assertFalse("预期测试失败", true) // 或者极简写法 assertFalse(true) } }
内容的提问来源于stack exchange,提问作者m0skit0




