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面骰子时通过,需要同步调整被测对象和断言逻辑:
- 将被测骰子改为6面:
val dice = Dice(6) - 可以选择固定断言范围为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
相关产品推荐
相关产品推荐

