Lanzada el 30 de septiembre de este año, está disponible la nueva versión de JUnit y, aunque no es tan disruptiva como la versión 5, trae mejoras y novedades interesantes que será importante tener en cuenta..

La nueva versión llega 8 años después del lanzamiento de la versión 5, de la que ya hablamos en su momento.

La primera de las novedades es que la versión mínima para su ejecución pasa a ser Java 17, siguiendo la tendencia del ecosistema. El versionado pasa a ser uniforme. En la versión 5, los paquetes dentro de org.junit.platform, tenían la versión 1.x.x. En la versión 6, es la misma para todos los paquetes de JUnit, lo que nos simplificará la gestión de versiones.

Las ejecuciones anidadas tienen orden determinístico al heredarse recursivamente las anotaciones @TestClassOrder y @TestMethodOrder en @Nested.

Se han introducido cambios en la visualización de los test configurados con @ParameterizedTest y @ParameterizedClass. Hay una mayor consistencia a la hora de mostrar etiquetas y, además, los nombres mostrados se entrecomillan por defecto, funcionalidad que se puede controlar con la propiedad quoteTextArguments. Lo comprobamos con un sencillo ejemplo:

    @ParameterizedTest
    @CsvSource(value = {
        "apple,         1",
        "banana,        2",
        "'lemon, lime', 0xF1",
        "strawberry,    700_000"
    })
    void test_With_Csv_Source(String fruit, int rank) {
        assertNotNull(fruit);
        assertNotEquals(0, rank);
    }
Resultado de la representación entre comillas de los nombres en test parametrizados
Resultado de la representación entre comillas de los nombres en test parametrizados

Otra de las novedades es que las anotaciones @CsvSource y @CsvFileSource se han migrado a FastCSV, debido al abandono en el mantenimiento de la librería univocity-parsers, que se venía utilizando hasta la versión de JUnit5.

La llamada de conversión de string a objeto para constructores de fábrica y constructores de método, también soporta CharSequence, además de String, que ya soportaba desde 5.1. Para ilustrarlo, podemos montar el siguiente ejemplo y ver cómo es capaz de convertir directamente cualquier record, clase, o incluso clase con builder estático, siempre que cuente únicamente con un atributo de tipo String o CharSequence:

    @ParameterizedTest
    @ValueSource(strings = "oak")
    void testStringToObjectConversionWithRecord(TreeType tree) {
        assertEquals("oak", tree.name());
    }

    public record TreeType(CharSequence name) {}

Ahora, todos los módulos de JUnit utilizan Jspecify para indicar parámetros y tipos de retorno nulos. La interfaz Arguments utilizada en test parametrizados es, oficialmente, una @FunctionalInterface. Y, por último, hay un nuevo método computeIfAbsent para el Namespace de ExtensionContext.

Funcionalidades descatalogadas

Las constantes JRE de versiones anteriores a la 17 se han descatalogado. Ya no tienen sentido al ser Java 17 la versión mínima para ejecutar.

JUnit vintage está deprecado y se mostrará un mensaje a nivel de INFO si se detectan test ejecutados con esta versión

Se ha eliminado completamente el módulo junit-platform-runner y se ha descatalogado junit-jupiter-migrationsupport

Los módulos junit-platform-jfr y junit-platform-suite-commons se han eliminado, y sus respectivas funcionalidades ahora se incluyen en junit-platform-launcher y junit-platform-suite.

Está descatalogado el soporte a maven surefly y failsafe para versiones anteriores a la 3.0.0

@CsvFileSource ya no cuenta con el atributo lineSeparator. El fin de línea se detecta automáticamente entre \r, \n o \r\n

Para ayudar a evitar entradas malformadas, se impide que haya caracteres extra después de las comillas en @CsvSource y @CsvFilesource.

Conclusiones

La nueva versión y las decisiones de actualizar a Java 17 y deprecar JUnit Vintage supone el último empujón para actualizar nuestros test antiguos a las nuevas versiones. La actualización del código es un factor siempre importante, ya que podremos sacar provecho a nuevas funcionalidades, mejoras de rendimiento y, no menos importante, mejoras de seguridad.

Si te quedan dudas, siempre puedes recurrir a la guía de usuario oficial.

Referencias

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete