我发现很难为这个方法编写单元测试,它基本上在用户键入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上进行验证.