es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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ón AfterEach de JUnit 5 junto con la clase Files de Java para eliminar el directorio temporal.

    Aquí hay una versión modificada de la clase abstracta que logra esto:

    import org.junit.jupiter.api.AfterEach;
    import org.junit.jupiter.api.io.TempDir;
    
    import java.nio.file.Files;
    import java.nio.file.Path;
    
    abstract class TestProvider {
    
        @TempDir
        protected Path tempDir;
    
        @AfterEach
        void cleanup() {
            try {
                Files.deleteIfExists(tempDir);
            } catch (Exception e) {
                // manejar la excepción si es necesario
            }
        }
    
        protected void helpWithSomething() {
            // vamos a fingir que realmente hace algo
        }
    }
    

    Al agregar la anotación @AfterEach a un método que elimina el directorio temporal utilizando la clase Files 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.

Comments are closed.