我正在尝试构建一个简单的应用程序,它具有如下的switch / case语句:
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");
}
}
我试图通过JUnit和Mockito来学习TDD来学习一些基础知识。但是我完全不知道如何测试程序已经退出。我必须创建一个MyApp对象,然后传入一个模拟的InputStream,其值为' Q'退出,所以嘲笑不合适。即使这种方法是公开的,也不是我能通过模拟调用的方法。
有没有人知道如何解决这个问题?
我知道this answer,但我没有测试静态方法,并且让另一个构造函数传入一个模拟的系统似乎有点过分。
这是我写的测试,从我链接的问题中得到答案:
@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");
}
但这是将依赖性问题抛到了正确和中心位置!我必须为PowerMock下载5个罐子才能工作,它仍然要求使用hamcrest / SelfDescribing。这可能是对的,我将按此速率下载所有内容。
答案 0 :(得分:3)
有几种方法可以在JUnit测试中测试System.exit()
:
System.exit()
的方法并在测试中覆盖此方法。原因是System.exit()
永远不会返回,因此控制永远不会返回到您的测试中。所以你必须确保不调用实际的方法。