Java 如何在jUnit中测试意外返回结果

Java 如何在jUnit中测试意外返回结果,java,junit,Java,Junit,我正在为吃豆人游戏编写一个测试用例。有一件事我很困惑,不知道如何进行 我有一个方法intmove(intstpes)返回一个int值并指示Pacman移动步骤 例如,如果move(3)返回3,则Pacman移动了3个步骤 如果move(3)返回-1,这意味着吃豆人死了,被鬼吃了 现在,幽灵的移动是随机的,我有一个不同的方法来处理这个。所以我无法控制我的测试用例,我无法控制Pacman是否会死亡。所以当幽灵不吃吃吃豆人时,我的测试用例通过了。 例如,我使用:assertEquals(2,move(

我正在为吃豆人游戏编写一个测试用例。有一件事我很困惑,不知道如何进行

我有一个方法
intmove(intstpes)返回一个
int
值并指示Pacman移动步骤

例如,如果
move(3)
返回3,则Pacman移动了3个步骤

如果
move(3)
返回-1,这意味着吃豆人死了,被鬼吃了

现在,幽灵的移动是随机的,我有一个不同的方法来处理这个。所以我无法控制我的测试用例,我无法控制Pacman是否会死亡。所以当幽灵不吃吃吃豆人时,我的测试用例通过了。 例如,我使用:
assertEquals(2,move(2))
测试Pacman移动了两个步骤。但是当返回
-1
时,如何编写测试

更新:

这就是我的
move()
方法的样子,我有一个幽灵移动方法
randomGhostMovement()
,它在
move()
方法中被调用:

int move(int stpes){
    for(int i=0; i< steps; i++){
        randomGhostMovement();
        //rest of logic omitted.
    }
}
int移动(int stpes){
对于(int i=0;i
您有一些不同的问题

  • 你有一个方法/类可以做很多不同的事情<代码>移动
  • 获取x并返回x或-1。这有点复杂,也没用。使用方法
    isPacmanDead
    创建一个类
    GameState
    ,怎么样。一般来说:将游戏分成许多小步骤,并使用无逻辑层简单地在循环中调用它们
  • 测试随机数。重构代码,以便能够手动移动重影,然后创建另一个无逻辑层,该层绘制一个随机数,并将其提供给
    moveGhost
    方法。然后在您的测试中,您可以忽略随机层并进行完全确定的测试。另一个有用的技术是使用依赖注入来提供随机性的来源,并在测试中模拟它以生成您想要的任何值

  • 如果您使用的是java.util.Random,则可以提供随机种子

    随机种子可以是任何
    值。
    每次使用相同的随机种子将保证生成相同的随机数

    例如:

        long randomSeed = 1449443188342L;
        Random random = new Random(randomSeed);
        for (int i = 0; i < 5; i++) {
            System.out.println("random number: " + random.nextInt(10));
        }
    

    如果每次生成的随机数完全相同,则重影移动将变得可预测。您可以使用某个随机种子设置一个新游戏,记录哪些操作会导致Pacman死亡,然后编写一个使用完全相同种子的测试用例。

    您可以显示您的代码吗?看起来您的问题是您正在硬编码驱动游戏进程的随机数生成器。为了使您的代码可测试,您应该允许从外部注入随机数生成器,这样您就可以用一个“操纵”的生成器替换它,该生成器返回可预测的“并非真正随机”的测试数。@kryger这就是我所做的。我有一个方法,随机生成鬼魂运动。这就是你的意思吗?@kryger我更新了我的OP以显示
    move()
    方法逻辑。@guillaumegirod vitouchkina更新了我的OP。
    random number: 3
    random number: 2
    random number: 7
    random number: 8
    random number: 0