Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to automatically migrate from JUnit 4 to JUnit 5?

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?

like image 582
Geoffrey De Smet Avatar asked Sep 15 '17 14:09

Geoffrey De Smet


1 Answers

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 @Rules (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, ExpectedExceptions, @Test(expected = …)) to assertThrows, perfectly augmenting IntelliJ.

I recommend the following steps:

  1. Add JUnit 5 artefacts to your test dependencies.
  2. Install Error Prone compiler.
  3. Configure it to produce a patch to migrate to assertThrows, enabling the following checks (the example Maven configuration is below):
    • TryFailRefactoring,
    • ExpectedExceptionRefactoring,
    • TestExceptionRefactoring.
  4. 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>
like image 88
Dmitry Timofeev Avatar answered Sep 19 '22 14:09

Dmitry Timofeev