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

时间:2015-12-06 20:55:11

标签: java junit

我正在为Pacman游戏写一个测试用例。有一件事我很困惑,不知道如何继续。

我有一个方法int move(int stpes);它返回一个int值并指示Pacman移动步骤。

例如,如果move(3)返回3,那么Pacman会移动3步。

如果move(3)返回-1,那意味着Pacman死了,被幽灵吃掉了。

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

更新:

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

int move(int stpes){
    for(int i=0; i< steps; i++){
        randomGhostMovement();
        //rest of logic omitted.
    }
}

2 个答案:

答案 0 :(得分:1)

你有一些不同的问题。

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

答案 1 :(得分:1)

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

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

例如:

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

无论我运行此代码多少次,我仍然得到相同的输出:

random number: 3
random number: 2
random number: 7
random number: 8
random number: 0

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