java - org - ¿Cuál es la forma correcta de escribir en el archivo temporal durante las pruebas de unidad con Maven?
org junit runners blockjunit4classrunner maven (6)
Escribía una rutina que determina dónde debe escribirse el archivo, que luego unitario, en general trato de evitar (como sea posible) el acceso a datos persistentes en pruebas unitarias, como el archivo IO o el acceso a la base de datos, esto tiene motivos de rendimiento y otros también .
Eche un vistazo a este archivo: https://stackoverflow.com/a/8032504/395659
He escrito una prueba de unidad que escribe un archivo en el sistema de archivos, dado que no hay una ruta que escriba en el directorio de trabajo; por lo tanto, si se ejecuta desde el directorio del proyecto, se escribe en la raíz del proyecto, si en el directorio principal del proyecto se escribe en el directorio raíz de los padres.
Entonces, ¿cuál es la forma correcta de escribir en el directorio de destino? ¿Posiblemente un directorio dentro del directorio de destino?
Si simplemente especifico el target/
con el archivo, escribirá en el objetivo del proyecto principal en lugar del objetivo del proyecto.
ACTUALIZACIÓN : en realidad quiero el archivo después de que termine la prueba. El archivo es para un formato de extracción para terceros que debe enviarse a terceros. La prueba se puede activar / desactivar para permitirme ejecutar solo si el formato del archivo cambia para su nueva aprobación. No es un gran problema donde va el archivo, pero me gustaría algo que sea fácil de encontrar.
Los archivos temporales se deben crear en el directorio temporal. Recupere usando la llamada System.getProperty("java.io.tmpdir")
El archivo temporal debe ser temporal, es decir, debe eliminarse cuando no sea necesario. Para lograr esto, no olvides eliminarlo en el bloque finally
o en el código que se ejecuta después de la prueba, es decir:
File tmpFile = ...
try {
// deal with tempFile
} finally {
tempFile.delete();
}
y / o
public class MyTestCase {
private File tmpFile = null;
@Before
public void setUp() {
tmpFile = ...;
}
@Test
public void setUp() {
// deal with tmpFile
}
@After
public void setUp() {
tmpFile.delete();
}
}
Use File.createTempFile(String prefix, String suffix)
si es posible, es decir, puede usar el archivo con el nombre especial generado por createTempFile()
.
Use file.deleteOnExit()
. Esto crea un gancho que elimina el archivo automáticamente cuando finaliza JVM. El archivo permanecerá solo si JVM fue asesinado con kill -9
, por lo que no tuvo la oportunidad de ejecutar el código de apagado.
No hay necesidad de reinventar la rueda...
El JDK proporciona una forma de crear un archivo temporal y una manera de eliminarlo automáticamente al salir:
File file = File.createTempFile( "some-prefix", "some-ext");
file.deleteOnExit();
Use el archivo y se eliminará automáticamente cuando finalice la prueba. Eso es todo al respecto.
Para especificar el directorio que se usará para los archivos temporales, use el método sobrecargado:
File file = File.createTempFile( "prefix", "ext", new File("/some/dir/path"));
Para decirlo de antemano, estoy totalmente en contra de hacer tales cosas en la prueba unitaria. Realmente no lo he intentado pero debería funcionar:
Supongamos que está utilizando el complemento surefire, del documento que citó que puede acceder al directorio base del proyecto bajo prueba por System.getProperty("basedir")
. Obténgalo y cree archivos bajo basedir / target.
Una forma más "apropiada" (ya que podemos tener la posibilidad de que configuremos el directorio de salida en otra cosa, puede cambiar la configuración del plugin surefire por algo como esto:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.6</version>
<configuration>
<systemPropertyVariables>
<myOutDir>${project.build.outputDirectory}</myOutDir>
</systemPropertyVariables>
</configuration>
</plugin>
Luego puede obtener el directorio de salida real por System.getProperty("myOutDir")
en su prueba.
Podría intentar usar TemporaryFolder JUnit @Rule como se describe here
TemporaryFolder crea una carpeta en el directorio predeterminado de archivos temporales especificado por la propiedad del sistema java.io.tmpdir. El método newFile crea un nuevo archivo en el directorio temporal y newFolder crea una nueva carpeta.
Cuando el método de prueba finaliza, JUnit elimina automáticamente todos los archivos y directorios e incluye el TemporaryFolder. JUnit garantiza eliminar los recursos, ya sea que la prueba pase o falle.
Después de la pregunta actualizada
Puede cambiar el directorio de trabajo utilizado por maven-surefire-plugin
.
<plugins>
[...]
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.3</version>
<configuration>
<workingDirectory>${project.build.directory}</workingDirectory>
</configuration>
</plugin>
[...]
</plugins>
Puede cambiar ese directorio de trabajo a cualquier cosa que necesite para sus pruebas como ${project.build.directory}/my_special_dir/
.
El directorio de trabajo en el plugin surefire solo afecta las pruebas que se están ejecutando y SÓLO para las pruebas realizadas por maven. Si ejecuta sus pruebas desde un IDE, el directorio de trabajo será otra cosa.
Querrá poder ejecutar sus pruebas tanto desde un IDE como desde Maven, por lo que la mejor práctica es escribir sus pruebas para que no supongan que se están ejecutando dentro de Maven.
Una de las mejores formas de tratar con archivos temporales es usar here . Esto le permite confiar en la regla para que lo limpie.