You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中Kotlin单元测试疑问:非6面骰子测试为何仍通过

问题分析:单元测试不符合预期的原因

你的Dice类代码:

class Dice(val numSides: Int) {
    fun roll(): Int {
        return (1..numSides).random()
    }
}

你的单元测试代码:

class ExampleUnitTest {
    @Test
    fun generates_number() {
        val dice = Dice(4)
        val rollResult = dice.roll()
        assertTrue("The value of rollResult was not between 1 and 6", rollResult in 1..6)
    }
}

问题原因:

测试通过的核心原因是断言范围远大于被测骰子的实际输出范围:

  • 4面骰子的roll()方法只会返回1到4之间的整数,而你断言的是结果是否在1到6之间,1-4的数值必然都满足这个条件,所以测试必然通过
  • 同理,5面骰子的输出范围1-5也完全包含在1-6里,测试也会通过;只有当骰子面数大于6时,才有可能出现超出1-6的结果,测试才会失败

修正方案:

如果想让测试仅在实例化6面骰子时通过,需要同步调整被测对象和断言逻辑:

  1. 将被测骰子改为6面:val dice = Dice(6)
  2. 可以选择固定断言范围为1-6,或者更严谨地关联骰子的numSides属性,让测试适配任意面数的骰子

修改后的测试代码示例:

class ExampleUnitTest {
    @Test
    fun generates_number() {
        val dice = Dice(6)
        val rollResult = dice.roll()
        // 关联骰子面数的断言方式,适用性更强
        assertTrue("Roll result $rollResult is not between 1 and ${dice.numSides}",
                   rollResult in 1..dice.numSides)
    }
}

内容的提问来源于stack exchange,提问作者Hassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 05:06:42