LS Price Increase Launch

The Price of all “Learn Spring” course packages will increase by $40 on next Friday:

>> GET ACCESS NOW

1. Overview

In this tutorial, we'll explore how to use JUnit fail assertion for common testing scenarios.

We'll also see fail() method differences between JUnit 4 and JUnit 5.

2. Using fail Assertion

The fail assertion fails a test throwing an AssertionError unconditionally.

When writing unit tests, we can use fail to explicitly create a failure under desired testing conditions.  Let's see some cases where this can be helpful.

2.1. Incomplete test

We can fail a test when it is incomplete or not yet implemented:

@Test
public void incompleteTest() {
    fail("Not yet implemented");
}

2.2. Expected Exception

We can also do it when we think an exception will happen:

@Test
public void expectedException() {
    try {
        methodThrowsException();
        fail("Expected exception was not thrown");
    } catch (Exception e) {
        assertNotNull(e);
    }
}

2.3. Unexpected Exception

Failing the test when an exception is not expected to be thrown is another option:

@Test
public void unexpectedException() {
    try {
        safeMethod();
        // more testing code
    } catch (Exception e) {
        fail("Unexpected exception was thrown");
    }
}

2.4. Testing Condition

We can call fail() when a result doesn't meet some desired condition:

@Test
public void testingCondition() {
    int result = randomInteger();
    if(result > Integer.MAX_VALUE) {
        fail("Result cannot exceed integer max value");
    }
    // more testing code
}

2.5. Returning Before

Finally, we can fail a test when the code doesn't return/break when expected:

@Test
public void returnBefore() {
    int value = randomInteger();
    for (int i = 0; i < 5; i++) {
        // returns when (value + i) is an even number
        if ((i + value) % 2 == 0) {
            return;
        }
    }
    fail("Should have returned before");
}

3. JUnit 5 vs JUnit 4

All assertions in JUnit 4 are part of org.junit.Assert class. For JUnit 5 these were moved to org.junit.jupiter.api.Assertions.

When we call fail in JUnit 5 and get an exception, we receive an AssertionFailedError instead of AssertionError found in JUnit 4.

Along with fail() and fail(String message), JUnit 5 includes some useful overloads:

  • fail(Throwable cause)
  • fail(String message, Throwable cause)
  • fail(Supplier<String> messageSupplier)

In addition, all forms of fail are declared as public static <V> V fail() in JUnit 5. The generic return type V, allows these methods to be used as single-statement in lambda expressions:

Stream.of().map(entry -> fail("should not be called"));

4. Conclusion

In this article, we covered some practical use cases for the fail assertion in JUnit. See JUnit Assertions for all available assertions in JUnit 4 and JUnit 5.

We also highlighted the main differences between JUnit 4 and JUnit 5, and some useful enhancements of the fail method.

As always, the full source code of the article is available over on GitHub.

LS Price Increase Launch

The Price of all “Learn Spring” course packages will increase by $40 on next Friday:

>> GET ACCESS NOW
Junit footer banner
Comments are closed on this article!