如何使用jUnit测试已处理的异常?

时间:2013-09-22 14:30:25

标签: java exception junit

我是jUnit的新手。无法弄清楚如何测试处理的异常。

 public File inputProcessor(String filePath){
    File file = null;
    try {
        file = new File(filePath);
        Scanner input = new Scanner(file);
    } catch (FileNotFoundException e) {
        System.out.print("Check your input file path");
        e.printStackTrace();
    }
    return file;
}

现在,想要使用无效的文件路径进行测试,以检查是否抛出异常并正确捕获异常。我写了这个

@Test (expected = java.io.FileNotFoundException.class)
public void Input_CheckOnInvalidPath_ExceptionThrown() {
    Driver driver = new Driver();
    String filePath = "wrong path";
    File file = driver.inputProcessor(filePath);
      }

但是因为我已经发现了我的例外它不起作用。测试失败了。任何帮助都会很棒!!日Thnx

2 个答案:

答案 0 :(得分:3)

您需要测试方法的行为,而不是测试实现细节。

如果方法的正确行为是在文件不存在时返回null,则只需要

@Test
public void Input_CheckOnInvalidPath_ExceptionThrown() {
    Driver driver = new Driver();
    String filePath = "wrong path";
    assertNull(driver.inputProcessor(filePath));
  }

如果您的方法的正确行为是在文件不存在时将特定邮件打印到System.out,并且您想要对其进行测试,那么您可以创建模拟PrintStream,使用{ {1}}设置它,调用您的方法,然后测试是否正确调用了System.setOut(PrintStream)。 Mockito可以帮助你做到这一点 - 也许吧。我认为您冒着测试PrintStream与许多System.out.println()被调用的实现细节的风险。 (您可能不应该测试System.out.print()的实现方式。)

如果两者都是正确的行为,则需要同时进行检查。

答案 1 :(得分:1)

此方法所需的公开行为是System.outSystem.err中相应行的外观。在测试代​​码中,您可以将System.out和System.err替换为您自己的PrintStream。请参阅System.setOutSystem.setErr

将每个PrintStream基于例如一个StringWriter。这样,在您的测试代码中,您可以获取String,表示该方法写入每个输出流的内容(如果有的话),并对其进行测试。