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