Search code examples
javaunit-testingtestng

TestNG: How to test for mandatory exceptions?


I'd like to write a TestNG test to make sure an exception is thrown under a specific condition, and fail the test if the exception is not thrown. Is there an easy way to do this without having to create an extra boolean variable?

A related blog post on this subject: http://konigsberg.blogspot.com/2007/11/testng-and-expectedexceptions-ive.html


Solution

  • @Test(expectedExceptions) is useful for the most common cases:

    • You expect a specific exception to be thrown
    • You need the message of that exception to contain specific words

    Per the documentation a test will fail if no expectedException is thrown:

    The list of exceptions that a test method is expected to throw. If no exception or a different than one on this list is thrown, this test will be marked a failure.

    Here are a few scenarios where @Test(expectedExceptions) is not sufficient:

    • Your test method has several statements and only one of them is expected to throw
    • You are throwing your own type of exception and you need to make sure it matches a certain criterion

    In such cases, you should just revert to the traditional (pre-TestNG) pattern:

    try {
      // your statement expected to throw
      fail();
    }
    catch(<the expected exception>) {
      // pass
    }