Issue
In the spirit of this question from JUnit 3 to JUnit 4, are there any list of regular expressions to efficiently migrate from the junit 4 API to the junit 5 API, regardless of the code size?
Solution
The tooling at the moment is not great, but improving:
- IntelliJ: Migrates most annotations to JUnit 5 versions. Hovewer, does not do anything if your test file contains
@Rule
s (e.g.,ExpectedException
) as of v2018.2. - Error Prone: contains built-in refactorings to automatically migrate various JUnit 4 exception-testing idioms (try/fail/catch/assert,
ExpectedException
s,@Test(expected = …)
) toassertThrows
, perfectly augmenting IntelliJ.
I recommend the following steps:
- Add JUnit 5 artefacts to your test dependencies.
- Install Error Prone compiler.
- Configure it to produce a patch to migrate to
assertThrows
, enabling the following checks (the example Maven configuration is below):- TryFailRefactoring,
- ExpectedExceptionRefactoring,
- TestExceptionRefactoring.
- Use IntelliJ built-in refactorings to migrate JUnit 4 annotations and methods to JUnit 5 counterparts.
I am not aware of any tools that help to automatically migrate Parameterized
tests, or rules other than ExpectedException
.
Here is an example Error Prone configuration:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<compilerId>javac-with-errorprone</compilerId>
<showWarnings>true</showWarnings>
<forceJavacCompilerUse>true</forceJavacCompilerUse>
<source>${java.compiler.source}</source>
<target>${java.compiler.target}</target>
<compilerArgs>
<arg>-XepPatchChecks:TryFailRefactoring,ExpectedExceptionRefactoring,TestExceptionRefactoring</arg>
<arg>-XepPatchLocation:${project.basedir}</arg>
</compilerArgs>
</configuration>
<dependencies>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-compiler-javac-errorprone</artifactId>
<version>2.8.3</version>
</dependency>
<dependency>
<groupId>com.google.errorprone</groupId>
<artifactId>error_prone_core</artifactId>
<version>2.3.2</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Answered By - Dmitry Timofeev
Answer Checked By - Mildred Charles (JavaFixing Admin)