Benefits

More readable test assertions

Truth’s fluent API allows users to write more readable test assertions. For example:

Optional<String> middleName = user.getMiddleName();
assertThat(middleName).isAbsent();

With JUnit, you’d have to negate the assertion:

Optional<String> middleName = user.getMiddleName();
assertFalse(middleName.isPresent());

More readable failure messages

Truth provides readable messages by default when your assertion fails. For example:

assertThat(googleColors).contains(PINK);

If this assertion fails, you’ll get the following message: <[BLUE, RED, YELLOW, BLUE, GREEN, RED]> should have contained <PINK>

With JUnit, most people would write:

assertTrue(googleColors.contains(PINK));

However, if that assertion fails, JUnit will throw an AssertionFailedError without any failure message! If you want a useful failure message with JUnit, you’re forced to duplicate the data under test in a custom failure message:

assertTrue(googleColors + " should have contained PINK", googleColors.contains(PINK));

Readable complex assertions

Truth allows you to express complex assertions in a readable way. For example, with Truth you could write:

assertThat(googleColors).containsNoneOf(PINK, BLACK, WHITE, ORANGE);

With JUnit, you’d have to write several assertions:

assertFalse(googleColors.contains(PINK));
assertFalse(googleColors.contains(BLACK));
assertFalse(googleColors.contains(WHITE));
assertFalse(googleColors.contains(ORANGE));