关于junit:在java异常的catch块中是否会捕获一个断言错误?

Will an assertion error be caught by in a catch block for java exception?

码:-

1
2
3
4
5
try {
    Assert.assertEquals("1","2");
} catch (Exception e) {
    System.out.println("I am in error block");
}

如果断言语句失败,我想捕获catch块中的错误。 我正在尝试上面的代码,它没有发生。

是否会在java异常的catch块中捕获断言错误?


你差不多回答了自己的问题。如果Assert失败,你的catch块将不会捕获Assert抛出的AssertionError,因为它是Error(或者更具体地,它扩展java.lang.Error)。有关详细信息,请参阅文档。 catch块只捕获扩展java.lang.ExceptionThrowable对象

如果你真的想抓住它 - 你需要使用

1
2
catch (AssertionError e) {
...

但是,正如其他人所提到的,这是使用断言的一种非常不寻常的方式 - 它们通常应该通过,如果它们失败,那么你想要继续执行程序是非常不寻常的。这就是失败抛出Error而不是Exception的原因。您可以在此问题中阅读有关(不)捕获Error的更多信息。

你确定你不只是想要一个测试 - if ( variableName =="1")吗?

注意如果你正在测试单元测试助手代码,比如匹配器,那么抓住AssertionError可能是有意义的。


好吧,我相信您正在使用JUnit编写测试。在这种情况下,您不应该捕获Assert.assertEquals()因为它们应该通过正常的测试执行。如果它抛出任何异常,则意味着您的代码没有按预期执行。


如果要同时捕获ExceptionError实例,请使用:

1
2
3
4
5
...
catch (Throwable t)
{
...
}

由于ExceptionError都延伸Throwable


如果您想以这种方式捕获错误,则需要以下内容:

1
2
3
if (num == 1 || num == 2) {
    throw new Exception();
}

您可以创建自己的异常类并传入所需的消息。