Skip to content
Text Size
Contrast

Use Plain JUnit5 for advanced test assertions

Proposed | 14 June 2023 | Lawrence Goldstien

Context and Problem Statement

How to write readable test assertions? How to write readable test assertions for advanced tests?

Considered Options

  • Plain JUnit5
  • Hamcrest
  • AssertJ

Decision Outcome

Chosen option: "Plain JUnit5", because comes out best (see below).

Consequences

  • Good, because tests are more readable
  • Good, because more easy to write tests
  • Good, because more readable assertions
  • Bad, because more complicated testing leads to more complicated assertions

Pros and Cons of the Options

Plain JUnit5

Homepage: https://junit.org/junit5/docs/current/user-guide/ JabRef testing guidelines: https://devdocs.jabref.org/getting-into-the-code/code-howtos#test-cases

Example:

String actual = markdownFormatter.format(source);
assertTrue(actual.contains("Markup<br />"));
assertTrue(actual.contains("<li>list item one</li>"));
assertTrue(actual.contains("<li>list item 2</li>"));
assertTrue(actual.contains("> rest"));
assertFalse(actual.contains("\n"));
  • Good, because Junit5 is "common Java knowledge"
  • Bad, because complex assertions tend to get hard to read
  • Bad, because no fluent API

Hamcrest

Homepage: https://github.com/hamcrest/JavaHamcrest

  • Good, because offers advanced matchers (such as contains)
  • Bad, because not full fluent API
  • Bad, because entry barrier is increased

AssertJ

Homepage: https://joel-costigliola.github.io/assertj/

Example:

assertThat(markdownFormatter.format(source))
    .contains("Markup<br />")
    .contains("<li>list item one</li>")
    .contains("<li>list item 2</li>")
    .contains("> rest")
    .doesNotContain("\n");
  • Good, because offers fluent assertions
  • Good, because allows partial string testing to focus on important parts
  • Good, because assertions are more readable
  • Bad, because not commonly used
  • Bad, because newcomers have to learn an additional language to express test cases
  • Bad, because entry barrier is increased
  • Bad, because expressions of test cases vary from unit test to unit test

More Information

German comparison between Hamcrest and AssertJ: https://www.sigs-datacom.de/uploads/tx_dmjournals/philipp_JS_06_15_gRfN.pdf.

Work in Progress!

This site is a work in progress and any opinions contained here are intended to spark discussion within each discipline's community of practice.


Last update: 2023-06-23
Created: 2023-06-23