Java编写unittest用于在用户键入控制台时退出程序

我发现很难为这个方法编写单元测试,它基本上在用户键入quit命令时退出程序.

SytemExit类:

public class SystemExit {
    public void exit(int status) {
        System.exit(status);
    }
}

我的静态方法:

public static void exitWhenQuitDetected() {
final SystemExit systemExit = new SystemExit();
final String QUIT = "quit";
String line = "";
try {
    final InputStreamReader input = new InputStreamReader(System.in);
    final BufferedReader in = new BufferedReader(input);
    while (!(line.equals(QUIT))) {
        line = in.readLine();
        if (line.equals(QUIT)) {
            System.out.println("You are now quiting the program");                  
            systemExit.exit(1);
        }
    }
} catch (Exception e) {
    System.err.println("Error: " + e.getMessage());
}
}   

因为我正在努力对方法exitWhenQuitDetected进行单元测试(我正在使用Mockito进行模拟),所以这里的东西并不完全正确.我如何模拟InputStreamReader并验证SystemExit.exit方法在看到退出时被调用?请问你能解决这个问题吗?谢谢.

添加了我正在进行的测试,它不起作用.

    @Test
@Ignore
public void shouldExitProgramWhenTypeQuit() {
    String quit = "quit";           
    SystemExit systemExit = mock(SystemExit.class);
    try {
        BufferedReader bufferedReader = mock(BufferedReader.class);
        when(bufferedReader.readLine()).thenReturn(quit + "\n");
        SomeClass.exitWhenQuitDetected();
        verify(systemExit, times(1)).exit(1);
    } catch (IOException e) {           
        e.printStackTrace();
    }       
}

解决方法:

您已经完成了90%的工作,将实际的退出代码放在一个没有自己逻辑的单独类中.您的困难是由您使用静态方法引起的.

我建议让exitWhenQuitDetected不是静态的.将它放在一个可以在需要时实例化的类中,并且可以使用模拟的SystemExit创建.像这样的东西.

public class SomeClass{
  private final SystemExit exiter;
  private final static String QUIT = "quit";
  public SomeClass(){
    this(new SystemExit());
  }

  SomeClass(SystemExit exiter){
    this.exiter = exiter;
  }

  public static void exitWhenQuitDetected() {    
    String line = "";    
    try {    
      final InputStreamReader input = new InputStreamReader(System.in);    
      final BufferedReader in = new BufferedReader(input);    
      while (!(line.equals(QUIT))) {    
        line = in.readLine();    
        if (line.equals(QUIT)) {    
          System.out.println("You are now quiting the program");                      
          exiter.exit(1);    
        }    
      }    
    } catch (Exception e) {    
      System.err.println("Error: " + e.getMessage());    
    }    
  }       

  // ...
}

然后,在测试中,您可以模拟SystemExit,并使用SomeClass的package-private构造函数创建一个将使用mock作为其exiter的对象.然后,您可以运行测试,并在模拟SystemExit上进行验证.

上一篇:java – Mockito FindIterable


下一篇:java – 验证是否从被测试的方法调用了继承的超类方法