如何测试程序是否退出?(JUnit)



我想建立一个简单的应用程序,它有一个开关/案例语句如下:

    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():

  1. 用PowerMock模拟
  2. 调用调用System.exit()的方法,并在测试中覆盖该方法。
  3. 使用System Rules库(感谢Stefan Birkner指出这一点)

原因是System.exit()永远不会返回,所以控制永远不会返回到您的测试。所以你必须确保实际的方法没有被调用

相关内容

  • 没有找到相关文章

最新更新