如何测试程序已退出? [JUnit的]

时间:2014-07-21 14:29:38

标签: java unit-testing junit mockito

我正在尝试构建一个简单的应用程序,它具有如下的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。这可能是对的,我将按此速率下载所有内容。

1 个答案:

答案 0 :(得分:3)

有几种方法可以在JUnit测试中测试System.exit()

  1. PowerMock
  2. 模拟它
  3. 调用调用System.exit()的方法并在测试中覆盖此方法。
  4. 使用System Rules library(感谢Stefan Birkner指出这一点)
  5. 原因是System.exit()永远不会返回,因此控制永远不会返回到您的测试中。所以你必须确保不调用实际的方法。