传递要捕获的异常类型

时间:2016-03-15 00:35:43

标签: java exception testing

我为自己的代码构建了一个小测试框架,我希望能够做到这一点:

test.callTo(() -> {/*...*/}).doesThrow(SomeException.class);

或类似的东西。

callTo方法只会构建一个包含java.lang.Runnable(或类似)的类的实例。该类将采用doesThrow方法,其中 某些参数 表示要捕获的异常类型,并执行此操作:

try {
    try {
        method.run();
    } catch(ThePassedInExceptionType e) {
        /* test passed */
        return;
    }
} catch (Throwable e) {}
/* test failed */

这类事可能吗?如果是这样,它怎么能完成,如果没有,我还能做些什么来确保我的代码抛出正确的异常而不是在我的测试代码中执行try / catch?

2 个答案:

答案 0 :(得分:1)

你可以做的是传递Class<? extends Exception>。请调用此参数clazz

然后你可以做

catch (Exception e) {
    if (clazz.isInstance(e)) 
        // do something
}

我不确定这是不是很好的做法,但它应该有用。

答案 1 :(得分:1)

我认为你不能直接这样做,因为异常处理表是在编译时构建的,你不知道预期的异常类型。

但是,您可以使用反射来做这样的事情:

try {
  method.run();
} catch (Throwable t) {
  if (exceptionClass.isInstance(t)) {
    return; /* test passed */
  }
  throw t;  /* test failed; propagate error */
}