19

我想为IndexOutOfBoundsException. 请记住,我们应该使用 JUnit 3。

我的代码:

public boolean ajouter(int indice, T element) {
    if (indice < 0 || indice > (maListe.size() - 1)) {
        throw new IndexOutOfBoundsException();
    } else if (element != null && !maListe.contains(element)) {
        maListe.set(indice, element);
        return true;
    }
}

经过一番研究,我发现您可以使用 JUnit 4 来做到这一点,@Test(expected = IndexOutOfBoundsException.class)但我在哪里找不到如何在 JUnit 3 中做到这一点。

如何使用 JUnit 3 进行测试?

4

6 回答 6

36

在 JUnit 3 中测试异常使用这种模式:

try {
     ... code that should throw an exception ...

     fail( "Missing exception" );
} catch( IndexOutOfBoundsException e ) {
     assertEquals( "Expected message", e.getMessage() ); // Optionally make sure you get the correct message, too
}

fail()如果代码没有引发异常,则确保您收到错误。

我在 JUnit 4 中也使用了这种模式,因为我通常想确保正确的值在异常消息中可见并且@Test不能这样做。

于 2012-11-06T14:01:35.663 回答
15

基本上,如果它没有抛出正确的异常,或者如果它抛出其他任何东西,你需要调用你的方法并失败:

try {
  subject.ajouter(10, "foo");
  fail("Expected exception");
} catch (IndexOutOfBoundException expect) {
  // We should get here. You may assert things about the exception, if you want.
}
于 2012-11-06T14:00:55.400 回答
4

一个简单的解决方案是在 unittest 中添加一个 try catch 并在没有抛出异常时让测试失败

public void testAjouterFail() {
  try {
    ajouter(-1,null);
    JUnit.fail();
  catch (IndexOutOfBoundException()) {
    //success
  }
}
于 2012-11-06T14:01:26.417 回答
3

您可以做的一件事是使用布尔值来运行测试以完成,然后您可以使用 assert 来验证是否引发了异常:

boolean passed = false;
try
{
    //the line that throws exception
    //i.e. illegal argument exception
    //if user tries to set the property to null:
    myObject.setProperty(null);
}
catch (IllegalArgumentException iaex)
{
    passed = true;
}
assertTrue("The blah blah blah exception was not thrown as expected"
              , passed);

通过使用此测试,您的测试将永远不会失败,并且您可以验证是否引发了特定的异常类型。

于 2014-02-04T07:55:34.447 回答
3

使用一些(静态导入)语法糖扩展@Aaron 的解决方案允许编写:

    expected(MyException.class,
        new Testable() {
            public void test() {
            ... do thing that's supposed to throw MyException ...
            }
        });

Testable就像一个使用 test() 签名抛出 Throwable 的 Runnable。

public class TestHelper {
    public static void expected(Class<? extends Throwable> expectedClass, Testable testable) {
        try {
            testable.test();
            fail("Expected "+ expectedClass.getCanonicalName() +" not thrown.");
        } catch (Throwable actual) {
            assertEquals("Expected "+ expectedClass.getCanonicalName() +" to be thrown.", expectedClass, actual.getClass());
        }
    }

    interface Testable {
        public void test() throws Throwable;
    }
}

您可以根据需要添加对异常消息的检查。

于 2015-05-14T19:39:15.650 回答
2

在您的测试方法中,在..块ajouter()内调用,给出一个值应该会导致抛出异常,使用trycatchindice

  • 捕获的catch子句IndexOutOfBoundsException:在这种情况下,从您的测试方法返回并因此表示通过。
  • 捕获的第二个catch子句Throwable:在这种情况下声明失败(调用fail()),因为抛出了错误类型的异常
  • try..之后catch声明失败(调用fail()),因为没有抛出异常。
于 2012-11-06T14:03:45.567 回答