Arthur Eirich
Arthur Eirich

Reputation: 3638

How to validate assertion error in production code with ExpectedException in a JUnit test

Having an assertion somewhere in a method myMethod in the production code like:

public void myMethod(List list1, List list2) {
 assert list1.size() == list2.size()
}

and a unit test

@Rule
public ExpectedException ex = ExpectedException.none();

@Test
public void test() throws Exception {
 ex.expect(java.lang.AssertionError.class);
 myMethod(Arrays.asList(1, 2), Arrays.asList(1, 2, 3));
}

I expect the unit test to successfully run but I get the AssertionError. Why is it so?

Upvotes: 0

Views: 664

Answers (1)

Sotirios Delimanolis
Sotirios Delimanolis

Reputation: 280102

Assuming you're using 4.11, the javadoc of ExpectedException states

By default ExpectedException rule doesn't handle AssertionErrors and AssumptionViolatedExceptions, because such exceptions are used by JUnit. If you want to handle such exceptions you have to call handleAssertionErrors() or handleAssumptionViolatedExceptions().

Assuming assertions are enabled with the -ea option, just add the call the handleAssertionErrors()

@Test
public void test() throws Exception {
    ex.handleAssertionErrors();
    ex.expect(java.lang.AssertionError.class);
    myMethod(Arrays.asList(1, 2), Arrays.asList(1, 2, 3));
}

You should no longer need the above in JUnit 4.12 (or in versions 10 and under).

Deprecated. AssertionErrors are handled by default since JUnit 4.12. Just like in JUnit <= 4.10.

This method does nothing. Don't use it.

Upvotes: 2

Related Questions