【问题标题】:Way to short-circuit propogation of checked exception in JUnitJUnit中检查异常的短路传播方法
【发布时间】:2013-09-18 22:58:55
【问题描述】:

我只是想到了一些我想做的小事,并且很好奇它是否有能力做到这一点。这纯粹是一种方便的语法糖之类的东西,几乎不是强制性的,但我认为可能在某个时候实现了一点便利。

我有一个方法位于 Junit 测试用例的辅助方法中的 2-3 层,该方法会引发检查异常。我知道如果这个异常被抛出,我想失败。但是,如果我只是调用 Fail(),我会丢失异常的堆栈跟踪以及允许异常传播所带来的其他便利

我知道“标准”方法是让方法抛出异常。但是,正如我所说,我已经深埋了一些方法,我怀疑这个方法将被许多未来的辅助方法调用。如果我在这个方法中抛出一个异常,我将不得不不断地向所有使用这个方法的方法添加一个 throw 子句,直接或间接地,这可能是相当多的方法。这显然是可行的,只是有点烦人;而且,至少在理论上,我可以掩盖抛出异常的情况,如果我的所有方法都已经抛出异常,我实际上想捕获它。

有没有一种方法可以告诉 JUnit 表现得好像异常 已经 传播到顶层并失败了,而不必让我的所有方法都抛出它?因此,JUnit 立即报告由于异常而导致的失败,以及堆栈跟踪和所有内容。本质上我想要一个接受异常的失败方法。

这样的东西是否存在,或者我必须简单地扔掉它?

ps。我知道我可以将它包装在 RuntimeException 中并重新抛出它,但我也不是很喜欢这个选项。

【问题讨论】:

    标签: java exception junit


    【解决方案1】:

    我在一个测试实用程序类中创建了一个标准函数,它创建并抛出一个 AssertionError(这就是 Fail method of jUnit does: )

    // this is from the JUnit source code 
    static public void fail(String message) {
        if (message == null) {
            throw new AssertionError();
        }
        throw new AssertionError(message);
    }
    

    所以,我的测试工具中有一个标准实用程序方法:

    static public void fail(String message, Throwable t) {
        if (message == null) {
            throw new AssertionError(t);
        }
        throw new AssertionError(message, t);
    }
    

    然后在fail方法上可以得到实际的异常......

    从你刚刚做的低级测试中

    MyTestUtilClass.fail("This exception was thrown", e);
    

    这个过程非常有效。你会得到一个标准的失败退出,还有原因异常的细节(在命令行上可见并且像 eclipse JUnit 界面一样思考)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      相关资源
      最近更新 更多