--- parent: Decision Records nav_order: 9 --- # Use Plain JUnit5 for advanced test assertions ## 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\). ### Positive Consequences * Tests are more readable * More easy to write tests * More readable assertions ### Negative Consequences * More complicated testing leads to more complicated assertions ## Pros and Cons of the Options ### Plain JUnit5 Homepage: JabRef testing guidelines: <../testing.md> Example: ```java String actual = markdownFormatter.format(source); assertTrue(actual.contains("Markup
")); assertTrue(actual.contains("
  • list item one
  • ")); assertTrue(actual.contains("
  • list item 2
  • ")); 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: * Good, because offers advanced matchers (such as `contains`) * Bad, because not full fluent API * Bad, because entry barrier is increased ### AssertJ Homepage: Example: ```java assertThat(markdownFormatter.format(source)) .contains("Markup
    ") .contains("
  • list item one
  • ") .contains("
  • list item 2
  • ") .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 ## Links * German comparison between Hamcrest and AssertJ: