开发者

Asserting exceptions in Java, how? [duplicate]

开发者 https://www.devze.com 2023-01-22 16:57 出处:网络
This question already has answers here: How do you assert that a certain exception is thrown in JUnit tests?
This question already has answers here: How do you assert that a certain exception is thrown in JUnit tests? (34 answers) Closed 7 years ago.

This might be a conceptually stupid question, but it also might not and since I am still a student I think I should I have no problem asking.

Imagine you hav开发者_JAVA技巧e a method that if given certain conditions it will throw an NumberFormatException. I want to write a Unit Test to see if the exception is being correctly thorwn. How can I achieve this?

P.S. I am using JUnit to write the Unit Tests.

Thanks.


As other posters suggested, if you are using JUnit4, then you can use the annotation:

@Test(expected=NumberFormatException.class);

However, if you are using an older version of JUnit, or if you want to do multiple "Exception" assertions in the same test method, then the standard idiom is:

try {
   formatNumber("notAnumber");
   fail("Expected NumberFormatException");
catch(NumberFormatException e) {
  // no-op (pass)
}


Assuming you are using JUnit 4, call the method in your test in a way that causes it to throw the exception, and use the JUnit annotation

@Test(expected = NumberFormatException.class)

If the exception is thrown, the test will pass.


If you can use JUnit 4.7, you can use the ExpectedException Rule

@RunWith(JUnit4.class)
public class FooTest {
  @Rule
  public ExpectedException exception = ExpectedException.none();

  @Test
  public void doStuffThrowsIndexOutOfBoundsException() {
    Foo foo = new Foo();

    exception.expect(IndexOutOfBoundsException.class);
    exception.expectMessage("happened?");
    exception.expectMessage(startsWith("What"));
    foo.doStuff();
  }
}

This is much better than @Test(expected=IndexOutOfBoundsException.class) because the test will fail if IndexOutOfBoundsException is thrown before foo.doStuff()

See this article and the ExpectedException JavaDoc for details


You can do this:

 @Test(expected=IndexOutOfBoundsException.class)
    public void testIndexOutOfBoundsException() {
        ArrayList emptyList = new ArrayList();
        Object o = emptyList.get(0);
    }


Use @Test(expected=IOException.class)

http://junit.sourceforge.net/doc/faq/faq.htm#tests_7

This is fine if you have one expected exception. An alternative strategy is to add an Assert.fail() at the end of the test method. If an exception isn't thrown then the test will fail accordingly. e.g.

@Test
public void testIOExceptionThrown() {      
   ftp.write(); // will throw IOException      
   fail();
}


Add this annotation before your test method; it'll do the trick.

@Test(expected = java.lang.NumberFormatException.class)
public void testFooMethod() {
    // Add code that will throw a NumberFormatException
}


A solution that is not bound to a particular JUnit version is provided by catch-exception which has been made to overcome some disadvantages that are inherent in the JUnit mechanisms.

0

精彩评论

暂无评论...
验证码 换一张
取 消