首页 > 解决方案 > (单元测试)如何保持扫描仪运行(Java)

问题描述

编辑: 这是我的一个错误,错误地更改了测试输入。它现在运行起来就像一个魅力 :) 感谢你们的帮助!如果需要,您可以关闭问题。

原文:我有一个作业应该读取用户输入(测试文件)并返回一些数据(输出)。一切运行良好,我通过了 2 个测试,但由于我的一些愚蠢的错误,流被关闭(通过测试后)。

Main 处理用户输入并声明并运行 Scanner,它从我创建的类中调用方法(由于分配限制,我无法更改 Main)。

这是我在课堂上写的代码:

public class MyInstance extends Intersection {

private boolean methodHasRun = false;
//  keeps count of getIntersectionState() loop
    private static int loop_count;

public String getIntersectionState(){

        String left = "LVg0";
        String right = "RVg0";
        String bottom = "BVr0";
        String top = "TVr0";
        String temp = " ";
        String temp1 = " ";
        String temp2 = " ";
        String temp3 = " ";
        String nr [] = {"1","2","3","4","5","6","7","8","9","10"};

//      if advanceTime() was executed
        if (this.methodHasRun) {
            
            //get last char, write it to temp
            temp = bottom.substring(bottom.length()-1).trim();  
            temp1 = top.substring(top.length()-1).trim();
            while(loop_count < nr.length-1) { 
                temp = "BVr" + nr[loop_count];
                temp1 = "TVr" + nr[loop_count];
                ++loop_count;
//              break after each increment
                break;
            }
            if(loop_count == 9) {
                temp = "BVr" + nr[8];
                temp1 = "TVr" + nr[8]; 
                ++loop_count;
            }else if(loop_count > 9) {
                while(loop_count < 20) {                
                temp = "BVg" + nr[8];
                temp1 = "TVg" + nr[8];
                temp2 = "LVr" + nr[loop_count-10];
                temp3 = "RVr" + nr[loop_count-10];
                ++loop_count; 
//              can't save left and right out of else if
//              because they will be assigned to: " "
                left = temp2;
                right = temp3;
                break;
                }
            }
                
            if(loop_count == 21) {
                temp = "BVg" + nr[9];
                temp1 = "TVg" + nr[9];
                temp2 = "LVr" + nr[9];
                temp3 = "RVr" + nr[9];
                
                left = temp2;
                right = temp3;
            }
            while(loop_count == 20) {
                temp2 = "LVr" + nr[9];
                temp3 = "RVr" + nr[9];
                ++loop_count;
                break;
            }
            if (loop_count > 21) {
                System.out.println("go on");
            }
            bottom = temp;
            top = temp1;

//          System.out.println("State changed!"+
//                  "\nLoop count is: "+loop_count);
            
//          revert to false until state changes again
            this.methodHasRun = false;
        
            } else {
            System.out.println("State hasn't changed");
            }
        return left +" "+ right +" "+ bottom +" "+ top;
    }
}

它在运行时产生: 在此处输入图像描述

测试输入文件为:

state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state
vehicle left
vehicle right
vehicle bottom
vehicle top
step
state

那应该输出:

LVg0 RVg0 BVr0 TVr0
LVg0 RVg0 BVr1 TVr1
LVg0 RVg0 BVr2 TVr2
LVg0 RVg0 BVr3 TVr3
LVg0 RVg0 BVr4 TVr4
LVg0 RVg0 BVr5 TVr5
LVg0 RVg0 BVr6 TVr6
LVg0 RVg0 BVr7 TVr7
LVg0 RVg0 BVr8 TVr8
LVg0 RVg0 BVr9 TVr9
LVr1 RVr1 BVg9 TVg9
LVr2 RVr2 BVg9 TVg9
LVr3 RVr3 BVg9 TVg9
LVr4 RVr4 BVg9 TVg9
LVr5 RVr5 BVg9 TVg9
LVr6 RVr6 BVg9 TVg9
LVr7 RVr7 BVg9 TVg9
LVr8 RVr8 BVg9 TVg9
LVr9 RVr9 BVg9 TVg9
LVr10 RVr10 BVg9 TVg9
LVg10 RVg10 BVr10 TVr10

我希望有人能发现我的错误或提出一些建议。

标签: javaunit-testingtestingjava.util.scanner

解决方案


您粘贴的每一行内容都与您的问题完全无关。相关部分是您使用和关闭该扫描仪的位置,以及您抛出“无法解析命令”异常的位置。

几点注意事项:

  1. 如果您正在调用scanner.close()某个地方或将其包装在 try-with-resources 中,请不要这样做。如果您无法修复该代码,请找到可以修复的人,并告诉他们修复他们的错误。
  2. 如果您必须解决它,您可以使用忽略调用System.in的包装器 PrintStream覆盖。close()这有点复杂,并且正在解决一个错误 - 即远远不如仅修复您的错误。缺少这个或删除scanner.close() / try-with-resources,没有神奇的--do-not-close-scanners选择。
  3. 如果堆栈跟踪是由关闭扫描仪引起的,则您的异常处理将被破坏。你至少应该做一些类似的事情throw new IllegalArgumentException("Cannot parse command", e);——那, e部分会造成原因。这很好,因为您目前没有这样做,并且无法知道实际出了什么问题(我只需要按照您的标题,它显然是一个封闭的 System.in)。

推荐阅读