2010-04-27 16 views
13

Estoy creando un TemporaryFolder usando la anotación @Rule en JUnit 4.7. Intenté crear una nueva carpeta que sea hija de la carpeta temp usando tempFolder.newFolder("someFolder") en el método @Before (configuración) de mi prueba. Parece que la carpeta temporal se inicializa después de que se ejecuta el método de instalación, lo que significa que no puedo usar la carpeta temporal en el método de instalación. ¿Es este comportamiento correcto (y predecible)?JUnit Rule TemporaryFolder

Respuesta

8

Esto es un problema en Junit 4.7. Si actualiza un Junit más nuevo (por ejemplo, 4.8.1), todos los @Rule se ejecutarán cuando ingrese el método @Before: s. Un informe de error relacionado es este: https://github.com/junit-team/junit4/issues/79

+0

gracias. tendré que actualizar –

+2

No quisiera que incluso con JUnit 4.8.2 que en Windows 7 la regla TemporaryFolder no funcione correctamente. Parece que es un problema de permisos. – exception

+1

el enlace está roto; trabajando uno: https://github.com/junit-team/junit4/issues/79 – jwd

6

Esto también funciona. EDITAR si en el método @Before parece que se ha llamado myfolder.create(). Y esta es probablemente una mala práctica ya que el javadoc dice que no llame a TemporaryFolder.create(). 2nd Edit Parece que debe llamar al método para crear los directorios temporales si no los quiere en los métodos @Test. También asegúrese de cerrar todos los archivos que abra en el directorio temporal o no se eliminarán automáticamente.

<imports excluded> 

public class MyTest { 

    @Rule 
    public TemporaryFolder myfolder = new TemporaryFolder(); 

    private File otherFolder; 
    private File normalFolder; 
    private File file; 

    public void createDirs() throws Exception { 
    File tempFolder = myfolder.newFolder("folder"); 
    File normalFolder = new File(tempFolder, "normal"); 
    normalFolder.mkdir(); 
    File file = new File(normalFolder, "file.txt"); 

    PrintWriter out = new PrintWriter(file); 
    out.println("hello world"); 
    out.flush(); 
    out.close(); 
    } 

    @Test 
    public void testSomething() { 
    createDirs(); 
    .... 
    } 
} 
+0

Si bien esto crea una nueva carpeta, tempFolder no está realmente en una ubicación temporal (está en su directorio de trabajo) porque myFolder no se ha establecido en una ubicación temporal. No se limpiará tampoco. –

+0

Esto deja los directorios en el directorio $ TEMP o% TEMP% por lo que sigue buscando una respuesta real. –