SonarQube se queja de un campo no utilizado anotado con @TempDir.
Utilizo JUnit 5 y tengo una clase abstracta simple que sirve como proveedor de pruebas para sus clases hijas:
abstract class TestProvider {
@TempDir
@SuppressWarnings("unused")
Path tempDir;
protected void helpWithSomething() {
// vamos a pretender que realmente hace algo
}
}
SonarQube se queja debido a la regla RSPEC-2924 que establece lo siguiente:
Esta regla también se aplica a las clases equivalentes de JUnit 5: TempDir y TestInfo.
Sorprendentemente, la página ofrece una solución sin ninguna creación de esa carpeta temporal, ya sea usando @Rule con versiones antiguas de JUnit o con @TempDir a partir de JUnit 5. Tenga en cuenta que el siguiente fragmento solo eliminó la línea no conforme sin ninguna solución alternativa y cumplida, lo cual es ridículo.
public class ProjectDefinitionTest {
@Test
public void shouldSetKey() {
ProjectDefinition def = ProjectDefinition.create();
def.setKey("mykey");
assertThat(def.getKey(), is("mykey"));
}
}
Esperaría al menos una solución cumplida relevante ya que esto rompe por completo el propósito de la prueba. Tenga en cuenta que tempDir se accede realmente mediante las clases hijas.
¿Cuál es el uso correcto y cumplido de @TempDir según SonarQube? Aunque soy consciente de usar una supresión diferente (@SuppressWarnings(“squid:S2924”)), me gustaría saber una solución cumplida.
davy.ai
Según SonarQube, se puede lograr un uso correcto y compatible de
@TempDir
utilizando una forma que asegure que el directorio temporal se elimine después de que el test haya terminado de ejecutarse. Esto se puede hacer utilizando la anotaciónAfterEach
de JUnit 5 junto con la claseFiles
de Java para eliminar el directorio temporal.Aquí hay una versión modificada de la clase abstracta que logra esto:
Al agregar la anotación
@AfterEach
a un método que elimina el directorio temporal utilizando la claseFiles
de Java, nos aseguramos de que el directorio temporal se elimine después de que cada test haya terminado de ejecutarse. Este enfoque cumple con las pautas de SonarQube para usar@TempDir
.