有没有办法用 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 可能是您要测试的第一个目标。它需要让测试可以访问。在这种情况下,通过将其设置为 staticpublic 并将其移动到单独的 class 很容易做到。包含 UI 文本会使该测试变得脆弱(例如,您决定将 "draw" 大写),因此请考虑使用枚举而不是 String.

测试获胜者的实际代码类似于:

import static mypackage.Decision.*;
// ...
    assertEquals("draw", winner(R, R));

只有九种可能的组合,因此详尽的测试是微不足道的。

与 UI 一样,全局状态使测试(以及其他所有内容)变得棘手。考虑用参数替换 System.inSystem.out。全局变量本身只需要在 main.

中被引用