java - 如何对没有参数的 void 方法进行单元测试

标签 java unit-testing junit switch-statement mockito

我需要测试一个类以确定在给定特定输入的情况下是否发生了相关操作。代码是这样的:

protected static void receiveInput() {
    String command;
    boolean b = true;
    Scanner scanner = new Scanner(System.in);

    while (b) {

        command = scanner.next();
        switch(command) {

            case "first":
                System.out.println("First!");
                break;

            case "second":
                System.out.println("Second!");
                break;

            case "third":
                System.out.println("Third!");
                break;

            default:
                System.out.println("\n***** Invalid *****\n"); 
        }

        System.out.println("\n");
    }

    scanner.close();
}

如果我能以某种方式控制命令字符串并跟踪扫描器对象,我可能可以获得非常彻底的单元测试。出于某种原因,我实际上不允许注入(inject)这两个对象作为此方法的参数。以不同的方式进行此测试有哪些选择?

最佳答案

这是使函数更易于测试的完美示例。此函数不接受任何输入,也不产生任何输出,仅通过副作用影响世界,使其完全无法通过标准方法进行测试。

重构此函数以使其更易于测试:

  • 不要通过扫描仪要求用户输入,将用户的输入作为输入参数。
  • 不打印结果,返回。

然后函数的调用者可以决定如何提供输入以及如何处理输出。您修改后的程序可以请求用户输入,调用函数,然后打印输出。测试框架可以提供输入列表中的输入以进行测试,并根据预期值检查输出。

关于java - 如何对没有参数的 void 方法进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31710949/

相关文章:

java - Android 中的线程问题

java - 如何将日期格式转换为mysql日期格式?

java - 在 Android Studio 中将信息保存到数据时出现问题

java - @BeforeClass 和继承 - 执行顺序

c# - 在 NHibernate 环境中创建数据驱动的单元测试

java - 使用@beforeeach设置一次性代码进行测试

java - 正确放置线模的 Junit 测试类中的 stub

java - 使用 Mockito 在其中调用 new() 测试类

java - 将 post 参数映射到请求中的 DTO

iphone - 向现有项目添加单元测试?