如何使用JUnit测试Kotlin中的函数 解决Dice类单元测试报错问题
报错根源
你测试中定义的dices列表是测试类的独立成员,和Dice类内部的dices没有任何关联。你在@Before方法中添加的元素都存在于测试类自己的列表里,Dice实例内部的dices始终是空列表,调用winningCheck()访问dices[0]时直接触发索引越界异常,这就是报错的核心原因。
同时现有Dice类本身存在设计缺陷:单独修改firstDice~fifthDice这五个变量,不会自动同步到内部的dices列表,只有调用throwDices()时才会往dices里新增元素,多次调用还会导致列表长度超过5,逻辑直接出错。
快速修复测试代码
如果暂时不修改Dice类的原有逻辑,可以直接操作Dice实例内部的dices列表完成测试:
class DiceTest { private val dice = Dice() @Before fun init() { // 直接操作Dice内部的dices列表 dice.dices.clear() dice.dices.addAll(listOf(1,1,1,1,1)) dice.dices.sort() // 匹配原逻辑中掷骰子后排序的操作 } @Test fun checkingFiveOfAKind () { assertEquals(15, dice.winningCheck()) } }
优化Dice类设计(推荐)
从根源解决数据不同步的问题,让dices列表由五个骰子变量动态生成,避免手动维护两份数据:
class Dice { var firstDice = 1 var secondDice = 1 var thirdDice = 3 var fourthDice = 2 var fifthDice = 2 // 动态生成排序后的骰子列表,自动同步五个变量的修改 val dices: List<Int> get() = listOf(firstDice, secondDice, thirdDice, fourthDice, fifthDice).sorted() fun throwDices() { firstDice = Random.nextInt(1,7) secondDice = Random.nextInt(1,7) thirdDice = Random.nextInt(1,7) fourthDice = Random.nextInt(1,7) fifthDice = Random.nextInt(1,7) println("Eldobtad a kockákat, az első kocka értéke: $firstDice") println("A második kocka értéke: $secondDice") println("A harmadik kocka értéke: $thirdDice") println("A negyedik kocka értéke: $fourthDice") println("Az ötödik kocka értéke: $fifthDice") println(dices) } fun winningCheck() :Int { if(dices[0] == dices[1] && dices[0] == dices[2] && dices[0] == dices[3] && dices[0] == dices[4] ) { return 15 } else if(dices[0] == dices[1] && dices[0] == dices[2] && dices[0] == dices[3]) { return 9 } else if (dices[0] == dices[1] && dices[0] == dices[2] && dices[3] == dices[4]) { return 5 } else if(dices[0] == dices[1] && dices[0] == dices[2] || dices[1] == dices[2] && dices[1] == dices[3] || dices[2] == dices[3] && dices[2] == dices[4]) { return 3 } else if(dices[0] == dices[1] && dices[2] == dices[3] || dices[1] == dices[2] && dices[3] == dices[4] || dices[0] == dices[1] && dices[3] == dices[4]) { return 2 }else if (dices[0] == dices[1] || dices[1] == dices[2] || dices[2] == dices[3] || dices[3] == dices[4]) { return 1 } else return 0 } }
优化后你原本的测试代码不用改dices相关逻辑,直接修改五个骰子变量就可以正常测试。
内容的提问来源于stack exchange,提问作者Tibor Tóth
相关产品推荐
相关产品推荐

