测试多行代码w.r.t相同的Exception

时间:2014-07-24 18:42:43

标签: java unit-testing junit

我有一个如下所示的代码段。每行代码都抛出相同的异常。但是,实际上,当第一行抛出异常时,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
    }

3 个答案:

答案 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()是多余的。如果方法抛出异常,则不会返回任何内容。

另一方面,这是一个非常奇怪的测试场景。如果一个方法抛出一个异常,那么停止任何进一步的处理似乎更合乎逻辑,如果这些进程下去也会抛出异常。