代码之家  ›  专栏  ›  技术社区  ›  Chris Knight

在大多数JUnit测试中抛出异常是否违反了最佳实践?

  •  42
  • Chris Knight  · 技术社区  · 16 年前

    public void testSomething() throws Exception
    

    我的理由是,我可以专注于我正在测试的内容,而不是JUnit似乎免费提供的异常处理。但我这么做有什么遗漏吗?这有违最佳实践吗?通过在测试中显式捕获特定的异常,然后失败(),我会得到什么好处吗?

    4 回复  |  直到 16 年前
        1
  •  61
  •   Ophidian    16 年前

    弱点 测试用例(它们不通过您的断言之一)和

    另一方面,如果您正在编写一个应该触发异常的测试,那么您可以使用 @Test(expected=IllegalArgumentException.class) JUnit 4注释的变体,或更常见的JUnit 3习惯用法:

    try {
      target.someMethodToTest();
      fail("Should have gotten an exception");
    } catch (IllegalStateException ise) {
      //expected, it's all good
    }
    
        2
  •  11
  •   Kevin Bourrillion Gergely    16 年前

    不要急功近利--你会失去有价值的信息。让所有的例外都飞出去。这意味着您需要将每个选中的异常添加到可以抛出的签名中。不过,我建议你不要采取懒惰的方式,盲目使用 throws Exception 作为一种习惯。这就让你不必这样做了 认为 关于API在异常方面的实际行为。

        3
  •  3
  •   jayshao    16 年前

    您可以在JUnit4中使用如下内容:@Test(expected=ArithmeticException.class),但是有些人发现它比显式try{}catch(Exception e)块更难读取/更不容易显示意图,如果您想检查状态(比如某个模拟对象,或者查看异常是否抛出在正确的位置,或者是否记录了,等等)

        4
  •  3
  •   duffymo    16 年前

    如果抛出了一个异常,而您没有预料到它,那么测试应该失败。

    如果是未检查的异常,我允许抛出异常并让JUnit通过测试。

    最近我倾向于在测试中不捕捉异常。如果它应该抛出一个异常,我就用注释来标记它。如果它抛出一个未检查的异常,我就让JUnit通过测试。如果是checked异常,我将throws子句添加到方法签名中,并让JUnit通过测试。