You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动