有没有办法用 JUnit 测试这个项目?
Is there a way to test with JUnit this project?
我创建了这个石头剪刀布项目
public class Rocksciccorspaper {
private static final int R = 1;
private static final int S = 2;
private static final int P = 3;
private int rounds;
public Rocksciccorspaper(int rounds) {
this.rounds = rounds;
}
private String winner(int userSelect, int botSelect) {
if (userSelect == botSelect) {
return "draw";
} else if (botSelect - userSelect == 1 || botSelect - userSelect == -2) {
return "Congrats, you won.";
} else {
return "You lose.";
}
}
public void start() {
Scanner sc = new Scanner(System.in);
int playedRounds = 0;
while (playedRounds < rounds) {
System.out.print("choose Rock(1), Sciccors(2), Paper(3): ");
int userSelect = sc.nextInt();
int botSelect = new Random().nextInt(3) + 1;
System.out.println("You Choose: "
+ selectionDetect(userSelect));
System.out.println("Bot Choose: "
+ selectionDetect(botSelect));
System.out.println(winner(userSelect, botSelect));
System.out.println();
playedRounds++;
}
sc.close();
}
private String selectionDetect(int selection) {
if (selection == R) {
return "Rock (1)";
} else if (selection == S) {
return "Sciccors (2)";
} else if (selection == P) {
return "Paper (3)";
} else {
return "Invalid Selection (" + selection + ")";
}
}
public static void main(String[] args) {
Rocksciccorspaper rocksciccorsPaper = new Rocksciccorspaper(3);
rocksciccorsPaper.start();
}
}
我想测试一下。我要测试的第一个功能是赢家功能。我认为这是重要的功能之一。
我尝试了一些方法,但效果不佳。我不确定如何在我的 if 条件下测试选择。
import static org.junit.Assert.*;
import org.junit.Test;
public class RocksciccorspaperTest {
@Test
public void test() {
fail("Not yet implemented");
}
}
如果很难想到测试,那么测试优先方法通常很有用。将您现有的代码放在一边。写一个测试。编写足够的代码来满足该测试(也许复制并粘贴您的旧代码;也许不是)。如果你愿意,重构。重复直到完成。
先测试一边:
方法 winner
可能是您要测试的第一个目标。它需要让测试可以访问。在这种情况下,通过将其设置为 static
和 public
并将其移动到单独的 class 很容易做到。包含 UI 文本会使该测试变得脆弱(例如,您决定将 "draw"
大写),因此请考虑使用枚举而不是 String
.
测试获胜者的实际代码类似于:
import static mypackage.Decision.*;
// ...
assertEquals("draw", winner(R, R));
只有九种可能的组合,因此详尽的测试是微不足道的。
与 UI 一样,全局状态使测试(以及其他所有内容)变得棘手。考虑用参数替换 System.in
和 System.out
。全局变量本身只需要在 main
.
中被引用
我创建了这个石头剪刀布项目
public class Rocksciccorspaper {
private static final int R = 1;
private static final int S = 2;
private static final int P = 3;
private int rounds;
public Rocksciccorspaper(int rounds) {
this.rounds = rounds;
}
private String winner(int userSelect, int botSelect) {
if (userSelect == botSelect) {
return "draw";
} else if (botSelect - userSelect == 1 || botSelect - userSelect == -2) {
return "Congrats, you won.";
} else {
return "You lose.";
}
}
public void start() {
Scanner sc = new Scanner(System.in);
int playedRounds = 0;
while (playedRounds < rounds) {
System.out.print("choose Rock(1), Sciccors(2), Paper(3): ");
int userSelect = sc.nextInt();
int botSelect = new Random().nextInt(3) + 1;
System.out.println("You Choose: "
+ selectionDetect(userSelect));
System.out.println("Bot Choose: "
+ selectionDetect(botSelect));
System.out.println(winner(userSelect, botSelect));
System.out.println();
playedRounds++;
}
sc.close();
}
private String selectionDetect(int selection) {
if (selection == R) {
return "Rock (1)";
} else if (selection == S) {
return "Sciccors (2)";
} else if (selection == P) {
return "Paper (3)";
} else {
return "Invalid Selection (" + selection + ")";
}
}
public static void main(String[] args) {
Rocksciccorspaper rocksciccorsPaper = new Rocksciccorspaper(3);
rocksciccorsPaper.start();
}
}
我想测试一下。我要测试的第一个功能是赢家功能。我认为这是重要的功能之一。
我尝试了一些方法,但效果不佳。我不确定如何在我的 if 条件下测试选择。
import static org.junit.Assert.*;
import org.junit.Test;
public class RocksciccorspaperTest {
@Test
public void test() {
fail("Not yet implemented");
}
}
如果很难想到测试,那么测试优先方法通常很有用。将您现有的代码放在一边。写一个测试。编写足够的代码来满足该测试(也许复制并粘贴您的旧代码;也许不是)。如果你愿意,重构。重复直到完成。
先测试一边:
方法 winner
可能是您要测试的第一个目标。它需要让测试可以访问。在这种情况下,通过将其设置为 static
和 public
并将其移动到单独的 class 很容易做到。包含 UI 文本会使该测试变得脆弱(例如,您决定将 "draw"
大写),因此请考虑使用枚举而不是 String
.
测试获胜者的实际代码类似于:
import static mypackage.Decision.*;
// ...
assertEquals("draw", winner(R, R));
只有九种可能的组合,因此详尽的测试是微不足道的。
与 UI 一样,全局状态使测试(以及其他所有内容)变得棘手。考虑用参数替换 System.in
和 System.out
。全局变量本身只需要在 main
.