我有一个如下所示的代码段。每行代码都抛出相同的异常。但是,实际上,当第一行抛出异常时,testFoo会按预期完成其工作并且不会继续。但是,我想要更多不同的东西;因为他们正在抛出相同的异常,所以我想继续并检查它们全部抛出的异常这三行。如果他们扔了,测试应该继续。
我怎样才能测试这三行w.r.t相同的异常?
@test
void testFoo(){
assertNull( /*errorMessage*/, ClassFoo.foo(null)); // foo will throw `AssertionError` due to null parameter
assertNull( /*errorMessage*/, ClassBar.bar(null)); // foo will throw `AssertionError` due to null parameter
assertNull( /*errorMessage*/, ClassGbr.gbr(null)); // foo will throw `AssertionError` due to null parameter
}
答案 0 :(得分:0)
我尝试使用Java内置的Assert.assertTrue ...
为每个参数实现前提条件
这不是内置于java中,而是来自junit:void junit.framework.Assert.assertTrue(...)
。您将Java Assertions与Junit断言相混淆。
应在单元测试中使用Junit断言。它们看起来像Assert.assertEquals(result, "expected result");
它们旨在测试单元测试中被测方法的有效性。
在验证假设时应使用Java断言。它们看起来像assert param!=null:"param should not be null!";
它们是java语言的一部分,可以在编译时打开和关闭。它们旨在仔细检查代码中的假设,并在关闭时产生零开销。
使用断言进行编程是一件好事。在单元测试之外使用Junit断言是可疑的。
答案 1 :(得分:0)
我对这个问题的解释是你在单元测试中期待AssertFailedError,这是本测试的一部分。如果是这种情况,您可以使用以下junit方法结构:
@Test(expected = AssertFailedError.class)
public void testFoo() throws AssertFailedError
{
assertNotNull(null);
}
当您测试一个您知道会抛出异常的代码块时,可以使用它。
答案 2 :(得分:0)
自己抓住异常:
@Test
void testFoo() {
boolean fooHasThrownException = false;
boolean barHasThrownException = false;
boolean gbrHasThrownException = false;
try {
ClassFoo.foo(null);
fail();
} catch (AssertionError e) {
fooHasThrownException = true;
}
try {
ClassBar.bar(null);
fail();
} catch (AssertionError e) {
barHasThrownException = true;
}
try {
ClassGbr.gbr(null);
fail();
} catch (AssertionError e) {
gbrHasThrownException = true;
}
assertThat(true, equalTo(fooHasThrownException),
equalTo(barHasThrownException),
equalTo(gbrHasThrownException));
}
请注意,您的assertNull()
是多余的。如果方法抛出异常,则不会返回任何内容。
另一方面,这是一个非常奇怪的测试场景。如果一个方法抛出一个异常,那么停止任何进一步的处理似乎更合乎逻辑,如果这些进程下去也会抛出异常。