我想建立一个简单的应用程序,它有一个开关/案例语句如下:
public void handleUserInput(char input){
switch(input) {
case 'L':
printBooksList();
break;
case 'Q':
System.exit(0);
default:
System.out.println("The option you chose was invalid");
}
}
我试着做这个TDD来学习一些基础知识,使用JUnit和Mockito。然而,我完全不知道如何测试一个程序已经退出。我必须创建一个MyApp的对象,然后传入一个模拟的输入流与值'Q'退出,所以不知何故模拟不适合。即使这个方法是公共的,它也不是一个我可以验证是否通过mock调用的方法。
有谁知道该怎么做吗?
我知道这个答案,但我不是在测试静态方法,并且在模拟出的系统中传递另一个构造函数似乎有些多余。
这是我写的测试,从我链接到的问题中获取答案:
@Test
public void shouldCallSystemExit() {
inputStream = new ByteArrayInputStream("X".getBytes());
testSubject = new BibliotecaApp(inputStream);
PowerMockito.mockStatic(System.class);
testSubject.handleUserInput('Q');
PowerMockito.verifyStatic();
System.exit(0);
System.out.println("If this message displays them System.exit() was mocked successfully");
}
但是这是把依赖问题抛到左右和中心!我已经下载了5个罐子PowerMock才能工作,它仍然要求hamcrest/selfdescripks。这肯定不对,按照这个速度我要下载所有东西了
有几种方法可以在JUnit测试中测试System.exit()
:
- 用PowerMock模拟
- 调用调用
System.exit()
的方法,并在测试中覆盖该方法。 - 使用System Rules库(感谢Stefan Birkner指出这一点)
原因是System.exit()
永远不会返回,所以控制永远不会返回到您的测试。所以你必须确保实际的方法没有被调用