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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:24:04