Migrating assertions
This page will help you convert your existing JUnit assertions to AssertJ ones. Note that both types of assertions can coexist, you don’t have to migrate all at once.
The idea is to convert code like:
assertEquals(expected, actual);
to:
assertThat(actual).isEqualTo(expected);
There are several ways to perform the conversion :
-
Automatically, with the provided migration scripts.
-
Automatically, with OpenRewrite.
-
Manually, with the regexes described in this section.
-
With IntelliJ IDEA, using these plugins:
-
Assertions2Assertj plugin.
-
-
With IntelliJ IDEA, using the Structural Search and Replace (SSR) feature.
The preferred approach is to use the provided migration scripts or OpenRewrite recipes as they are type safe and cover more assertions than the other ones.
Migration Scripts
It is as simple as running one of the following scripts depending on which test framework you are using:
Each shell script is based on the sed stream editor and regexps. It recursively looks at all *Test.java files and
performs search and replace to convert assertions to AssertJ ones.
The script handles the cases where you use an assertion description, for example:
assertEquals("test context", "a", "a");
will be replaced by:
assertThat("a").as("test context").isEqualTo("a");
Note that the script does a best effort and some assertions might not be converted if formatted on multiple lines. Anyway the script usually migrates the vast majority of assertions.
The script works on Windows within a bash console like git bash (tested a long time ago) or cygwin (not tested).
Usage
Execute the script in the base directory containing the test files:
cd ./src/test/java
./convert-junit-assertions-to-assertj.sh
If the *Test.java file pattern does not suit you, just specify another as an argument:
# enclose your pattern with double quotes "" to avoid it to be expanded by your shell prematurely
./convert-junit-assertions-to-assertj.sh "*IT.java"
After executing it, you will need to :
-
Optimize imports with your IDE to remove unused imports.
-
If you were using
assertEqualswith a delta to compare numbers, you will need to statically importorg.assertj.core.api.Assertions.withinwhich is how you express deltas in AssertJ (see the number_assertions_with_offset_examples() test at the end ofNumberAssertionsExamples).
Script output
Converting JUnit assertions to AssertJ assertions on files matching pattern : *Test.java
1 - Replacing : assertEquals(0, myList.size()) ............... by : assertThat(myList).isEmpty()
2 - Replacing : assertEquals(expectedSize, myList.size()) .... by : assertThat(myList).hasSize(expectedSize)
3 - Replacing : assertEquals(expectedDouble, actual, delta) .. by : assertThat(actual).isCloseTo(expectedDouble, within(delta))
4 - Replacing : assertEquals(expected, actual) ............... by : assertThat(actual).isEqualTo(expected)
5 - Replacing : assertArrayEquals(expectedArray, actual) ..... by : assertThat(actual).isEqualTo(expectedArray)
6 - Replacing : assertNull(actual) ........................... by : assertThat(actual).isNull()
7 - Replacing : assertNotNull(actual) ........................ by : assertThat(actual).isNotNull()
8 - Replacing : assertTrue(logicalCondition) ................. by : assertThat(logicalCondition).isTrue()
9 - Replacing : assertFalse(logicalCondition) ................ by : assertThat(logicalCondition).isFalse()
10 - Replacing : assertSame(expected, actual) ................. by : assertThat(actual).isSameAs(expected)
11 - Replacing : assertNotSame(expected, actual) .............. by : assertThat(actual).isNotSameAs(expected)
Replacing JUnit static imports by AssertJ ones, at this point you will probably need to :
12 --- optimize imports with your IDE to remove unused imports
12 --- add "import static org.assertj.core.api.Assertions.within;" if you were using JUnit number assertions with deltas
OpenRewrite
OpenRewrite, a large-scale automated source code refactoring tool, offers a couple of recipes that assist with the migration to AssertJ:
The Migrate Hamcrest to AssertJ assertions recipe will:
-
Migrate various Hamcrest
Matchersto AssertJ (e.g., changingequalTotoisEqualToor changing!emptyStringtoisNotEmpty) -
Migrate the Hamcrest
is(Object)method to AssertJ -
Remove the Hamcrest
is(Matcher)method -
Add Gradle or Maven dependencies as needed
If you want to go even further, you can run the AssertJ best practices recipe which will do all of the above plus:
-
Migrate JUnit to AssertJ (e.g., changing
assertEquals()toassertThat().isEqualTo()) -
Simplify AssertJ chained assertions (e.g.,
assertThat(foo.size()).isEqualTo(1)would change toassertThat(foo).hasSize(1)) -
Statically import AssertJ’s
assertThat(rather than inlining theAssertionsclass name in tests)
To learn more about how to run these recipes, please see the OpenRewrite Gradle or OpenRewrite Maven instructions.
Migration Regexes
Here’s a list of find/replace expressions to change JUnit assertions into AssertJ assertions (don’t forget to check the regex mode in your editor replace window).
This regexes described in this section are specific to JUnit 4 but you can easily adapt them for JUnit 5 or TestNG.
The order of find/replace is important to benefit from the most relevant AssertJ assertions. For example you should convert assertEquals(0, myList.size()) to assertThat(myList).isEmpty() instead of assertThat(myList.size()).isEqualTo(0).
Converting assertions
Converting assertEquals(0, myList.size()) to assertThat(myList).isEmpty()
Find/replace regex:
assertEquals\(0,(.*).size\(\)\); -> assertThat(\1).isEmpty();
It’s better to run this before the assertEquals → isEqualTo conversion to avoid ending with assertThat(myList.size()).isEqualTo(0).
Converting assertEquals(size, myList.size()) to assertThat(myList).hasSize(size)
Find/replace regex:
assertEquals\((.*),(.*).size\(\)\); -> assertThat(\2).hasSize(\1);
It’s better to run this before the assertEquals → isEqualTo conversion to avoid ending with assertThat(myList.size()).isEqualTo(expectedSize).
Converting assertEquals(expected, actual) to assertThat(actual).isEqualTo(expected)
Find/replace regex:
assertEquals\((.*),(.*)\); -> assertThat(\2).isEqualTo(\1);
Converting assertNull(objectUnderTest) to assertThat(objectUnderTest).isNull()
Find/replace regex:
assertNull\((.*)\); -> assertThat(\1).isNull();