【问题标题】:How to test already handled exception using jUnit?如何使用 jUnit 测试已经处理的异常?
【发布时间】:2013-09-22 14:30:25
【问题描述】:

我是 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);
      }

但是因为我已经发现了我的异常,所以它不起作用。测试失败。任何帮助都会很棒!谢谢

【问题讨论】:

  • 如果异常没有被抛出,即使你引发了它,那么它被正确捕获了。有什么问题?
  • 您为什么要测试该方法一开始就没有表现出的行为!?
  • 你检查过herehere提出的解决方案
  • 正如@TreyJonn 的链接中所述:测试应该测试暴露的行为,而不是实现细节。如果您只需要测试方法的一部分(即如何专门处理异常),这表明您的方法已经做了太多,需要拆分成几个方法,然后可以经过测试(但可能不应该是public)。
  • @rocketboy 没有得到你的问题。

标签: java exception junit


【解决方案1】:

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

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

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

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

如果正确的行为是两者,那么你需要两个检查。

【讨论】:

  • 感谢 Jeremy 简洁明了的回答。 “你需要测试你的方法的行为,而不是它的实现细节”——我从来没有想过这个概念。
  • 我在上面的评论中确实说过同样的话:“测试应该测试暴露的行为,而不是实现细节。”
  • 是的,你确实做到了!谢谢你。正如我所说的刚刚开始掌握单元测试的整个概念,使用 sn-ps 很容易理解!
【解决方案2】:

您需要从该方法中公开的行为是在System.outSystem.err 中出现适当的行。在您的测试代码中,您可以将 System.out 和 System.err 替换为您自己的 PrintStream。请参阅System.setOutSystem.setErr

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2011-01-28
    • 2018-10-09
    相关资源
    最近更新 更多