如何在Java中对任何输出进行JUnit测试

如何在Java中对任何输出进行JUnit测试,java,unit-testing,junit,Java,Unit Testing,Junit,我想测试下面的两种方法,但因为它基于随机输出,所以我的go toassertEquals()无法工作 我只是想测试以确保这些方法产生某种输出。有什么想法吗 新手程序员,感谢您的帮助 public void compRandomChoice() { double choice = (Math.random() * 100 / 100); if (choice > 0 && choice <= 0.34) { computer.s

我想测试下面的两种方法,但因为它基于随机输出,所以我的go to
assertEquals()
无法工作

我只是想测试以确保这些方法产生某种输出。有什么想法吗

新手程序员,感谢您的帮助

    public void compRandomChoice() {
    double choice = (Math.random() * 100 / 100);

    if (choice > 0 && choice <= 0.34) {
        computer.setChoice(HandThrow.ROCK);
    } else if (choice > 0.34 && choice <= 0.67) {
        computer.setChoice(HandThrow.PAPER);
    } else {
        computer.setChoice(HandThrow.SCISSORS);
    }
}


    public String gameWinner() {
    String gameResult;

    if (human.getChoice() == computer.getChoice()) {
        gameResult = "ITS A TIE!";
    } else if (human.getChoice() == HandThrow.ROCK
            && computer.getChoice() == HandThrow.SCISSORS
            || human.getChoice() == HandThrow.PAPER
            && computer.getChoice() == HandThrow.ROCK
            || human.getChoice() == HandThrow.SCISSORS
            && computer.getChoice() == HandThrow.PAPER) {
        gameResult = "CONGRATS, YOU WIN!";
    } else {
        gameResult = "COMPUTER WINS!";
    }
    return gameResult;

}
public void compRandomChoice(){
双击=(Math.random()*100/100);

if(choice>0&&choice 0.34&&choice我建议如下更改
compRandomChoice()
函数

public void compRandomChoice(double rand_no) {
    double choice = (rand_no * 100 / 100);

    if (choice > 0 && choice <= 0.34) {
        computer.setChoice(HandThrow.ROCK);
    } else if (choice > 0.34 && choice <= 0.67) {
        computer.setChoice(HandThrow.PAPER);
    } else {
        computer.setChoice(HandThrow.SCISSORS);
    }
}

在代码中,您可以将函数调用为
gameWinner(human.getChoice(),computer.getChoice())
。在单元测试中,您可以硬编码输入(使用与前面函数类似的方法)并断言根据传递的参数获得预期结果。

我会将getting random提取到包私有方法中

double getRandomChoice() {
    return (Math.random() * 100 / 100);
}
所以在测试中我可以忽略它

    MyClass mc = new MyClass() {
        @Override
        double getRandomChoice() {
            return 2.0;
        }
    };

您所发现的是,您希望测试(断言)您的代码在给定某些输入的情况下是否正确运行,但在编写代码时,您无法轻松控制有问题的输入。祝贺您!您已经发现了测试驱动开发的优点之一

解决方案是以一种更容易测试所关心的属性的方式重新构造代码

对于
compRandomChoice
函数,您关心什么属性?也许它会生成一个均匀分布在三个选项上的输出。要做到这一点,您可以想象编写一个简短的测试,迭代多次调用
compRandomChoice
,并进行一些简单的分析(以及大数定律)表明你在三分之一的时间里得到了每个选择

gameWinner
功能如何?在这里,您需要尝试不同的输入组合,并验证是否确定了正确的赢家。算法的输入是计算机和人类做出的选择。因此,要测试它,您必须能够制造人类和计算机的选择,并将它们提供给算法。这通常是通过使用依赖项注入来完成的……这是在构造函数中提供算法所依赖的对象或作为参数,而不是硬编码它们

例如,最简单的方法是将选项传递到
gameWinner
函数中,并让它返回一个winner(例如,作为枚举):

那么测试就很容易编写了:

@Test
public void paperBeatsRock() {
    assertEquals(gameWinner(HandThrow.ROCK, HandThrow.PAPER), PLAYER2);
}

看一看;它给出了很多关于如何成功完成您想做的事情的提示。

对于我的需要和可用时间,我找到了assertNotNull()测试方法,并使用了它

@Test
public void testGameWinner() {
    assertNotNull(testLogic.gameWinner());

考虑到这些选择,这看起来是最好的方法,但是它需要我围绕MVC概念对代码进行一些广泛的重构,所以现在我使用assertNotNull在紧要关头完成这项工作。谢谢!感谢链接!我将深入探讨这一点。
@Test
public void paperBeatsRock() {
    assertEquals(gameWinner(HandThrow.ROCK, HandThrow.PAPER), PLAYER2);
}
@Test
public void testGameWinner() {
    assertNotNull(testLogic.gameWinner());