Practice: Improve Test Expressiveness
Ready to practice improving test expressiveness with AssertJ? We've prepared a test class with verbose JUnit assertions that you can refactor.
Exercise: DiscountCalculatorTest
The DiscountCalculatorTest class in the orders module demonstrates common assertion anti-patterns:
What you'll find
- ❌ Verbose JUnit assertions:
assertEquals,assertTrue,assertNotNull - ❌ Manual BigDecimal comparisons: Using
compareTo()in assertions
Your task
Refactor the tests to use AssertJ for better expressiveness.
Hints:
- AssertJ uses a fluent API that starts with
assertThat(actualValue). - Look at the Poor expressiveness examples for patterns.
- BigDecimal comparisons have special assertion methods that are more readable than
compareTo(). - Multiple assertions on the same object can be chained together.
- The
.as()method can add descriptive messages to your assertions. - Check the reference table below for common patterns.
Running the test
You can run the test in your IDE or use the following commands:
# Run the test
mvn test -pl orders -Dtest=DiscountCalculatorTest
# Or run all tests in the orders module
mvn test -pl orders
Automated refactoring
You can use OpenRewrite to automatically migrate JUnit assertions to AssertJ:
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-testing-frameworks:RELEASE \
-Drewrite.activeRecipes=org.openrewrite.java.testing.assertj.Assertj
What you'll learn
By completing this exercise, you'll gain hands-on experience with:
- Converting verbose JUnit assertions to expressive AssertJ assertions.
- Using AssertJ's fluent API for better readability.
- Handling BigDecimal comparisons elegantly.
- Writing assertions that clearly convey test intent.
- Creating better failure messages.