gpt4 book ai didi

java - 如何使用 JUnit 或 Mockito 测试使用 Random() 的方法(不带参数和返回值)

转载 作者:行者123 更新时间:2023-12-01 07:17:46 25 4
gpt4 key购买 nike

我正在学习成为一名 Java 开发人员,现在我正在学习测试驱动开发,这意味着我对 JUnit 和 Mockito 还很陌生。

我已经挣扎了一段时间了,但我陷入了困境。

我不知道如何测试这个没有参数、没有返回值和随机发生器的特定方法。

旧逻辑:

public void getPlayerToStart(int randomNr) {
if (randomNr == 1) {
currentPlayer = p1;
opponentPlayer = p2;
} else {
currentPlayer = p2;
opponentPlayer = p1;
}
}

旧测试

@Test
void testSetCurrentPlayerSetToPlayer1() {
gameEngine.getPlayerToStart(1);
assertEquals(gameEngine.getP1(), gameEngine.getCurrentPlayer());
assertEquals(gameEngine.getP2(), gameEngine.getOpponentPlayer());
}

@Test
void testSetCurrentPlayerSetToPlayer2() {
gameEngine.getPlayerToStart(2);
assertEquals(gameEngine.getP2(), gameEngine.getCurrentPlayer());
assertEquals(gameEngine.getP1(), gameEngine.getOpponentPlayer());
}

新逻辑:

public void getPlayerToStart() {
Random rand = new Random();
int randomNr = rand.nextInt(2) + 1;
if (randomNr == 1) {
currentPlayer = p1;
opponentPlayer = p2;
} else {
currentPlayer = p2;
opponentPlayer = p1;
}
}

我不确定如何在没有参数“randomNr”的情况下测试 getPlayerToStart() ..有人可以指出我正确的方向吗!

提前致谢。

最佳答案

请始终记住,“天哪,这很难测试”的想法是 TDD 试图向您尖叫,设计需要审查。

I have no idea how to test this particular method that has no arguments, no return value and a randomizer.

随机数是一种副作用,就像 I/O 或时间一样,应该在设计中以这种方式处理。

也就是说,如果您正在进行 TDD,您应该认识到的一件事是,随机性的来源是系统的输入;它是 imperative shell 的一部分它由运行测试时的测试工具提供,并由生产中的组合根提供。

可测试的方法将“生成种子”与“从种子计算状态”分开;单元测试对于后一点来说非常有用,因为纯函数真的很容易测试。生成随机数是 state of sin级别很难测试,但是通过一些设计,您可以将其周围的代码简化到“显然没有缺陷”。

您可能还想查看Writing Testable Code ,作者 Misko Hevery,或 Tales of the Fischer King .

关于java - 如何使用 JUnit 或 Mockito 测试使用 Random() 的方法(不带参数和返回值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53110890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com