为什么不调用处理 `assertEquals` 的 `catch(Exception ex)` 中的 `fail` ?

bul*_*l19 1 java junit

几分钟前我就有了这个问题,但我想尝试别的东西。

\n

例如我有这个方法:

\n
//inside Number.java\npublic static int add(int nr1, int nr2) {\n    return nr2 + nr2;\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

如你所见,我返回 number2 + number2

\n

在我的测试中,我使用它会抛出预期为 9 的错误,而不是在 main 方法中计算的数字。

\n
@Test\npublic void test() throws Exception {\n    int nr1 = 4;\n    int nr2 = 5;\n    int sum = Number.add(nr1, nr2);\n    assertEquals(9, sum);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我现在尝试这样做,以便在程序失败时收到一条消息,但它不会\xc2\xb4t 失败。

\n
@Test\npublic void test() throws Exception {\n    int nr1 = 4;\n    int nr2 = 5;\n    int sum = Number.add(nr1, nr2);\n    \n    try {\n        assertEquals(9, sum);\n    }catch(Exception e) {\n        fail("Are you sure you calculate the right numbers?");\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但程序只向我显示 AssertionError 而不是失败()中的消息

\n

我现在知道我可以这样使用它:

\n
assertEquals("...",9,sum);\n
Run Code Online (Sandbox Code Playgroud)\n

但我不想要这个断言错误:

\n
expected:<> but was <> \n
Run Code Online (Sandbox Code Playgroud)\n

在最后

\n

f1s*_*1sh 5

实现.AssertionErrorErrorThrowable你的

catch(Exception e)
Run Code Online (Sandbox Code Playgroud)

没用,因为AssertionError不是Exception.

catch(AssertionError e)如果必须的话,可以直接使用 s 来捕获它,但通常Error不应该捕获它。

如果您确实想强制调用fail,请避免assertEquals并使用

if(sum != 9) {
  fail("Are you sure you calculate the right numbers?");
}
Run Code Online (Sandbox Code Playgroud)

这完全避免了断言错误。