Sé que puedo cargar un archivo de src / test / resources con:
getClass().getResource("somefile").getFile()
Pero, ¿cómo puedo obtener la ruta completa al directorio src / test / resources , es decir, no quiero cargar un archivo, solo quiero saber la ruta del directorio?
org.junit.rules.TemporaryFolder
todo el tiempo ... pero ... para copiar de la prueba / recursos, ¡debes saber, er, su ruta!Respuestas:
Intenta trabajar con la
ClassLoader
clase:A
ClassLoader
es responsable de cargar en las clases. Cada clase tiene una referencia a aClassLoader
. Este código devuelve unFile
desde el directorio de recursos. InvocarlogetAbsolutePath()
devuelve su absolutoPath
.Javadoc para
ClassLoader
: http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.htmlfuente
No necesita meterse con cargadores de clases. De hecho, es un mal hábito entrar porque los recursos del cargador de clases no son objetos java.io.File cuando están en un archivo jar.
Maven establece automáticamente el directorio de trabajo actual antes de ejecutar pruebas, por lo que puede usar:
resourcesDirectory.getAbsolutePath()
devolverá el valor correcto si eso es lo que realmente necesita.Recomiendo crear un
src/test/data
directorio si desea que sus pruebas accedan a los datos a través del sistema de archivos. Esto deja en claro lo que estás haciendo.fuente
Simplemente usaría
Path
de Java 7¡Limpio y ordenado!
fuente
Paths.get(...)
sugiere (para mí de todos modos) que no lo hará.File.separator
constante para construir la cadena que se utilizará como rutanew File("src/test/resources")
hace lo correcto en todas las plataformas.Path resourceDirectory = Paths.get("src","test","resources");
?Paths.get("src", "test", "resources")
yPaths.get("src/test/resources")
funciona bien en Windows 10 para mí. ¿Qué estoy haciendo mal? =)Si se trata de un proyecto de primavera, podemos usar el siguiente código para obtener archivos de la carpeta src / test / resource .
fuente
Tengo un proyecto Maven3 usando JUnit 4.12 y Java8. Para obtener la ruta de un archivo llamado
myxml.xml
debajosrc/test/resources
, hago esto desde el caso de prueba:Probado en Ubuntu 14.04 con IntelliJ IDE. La referencia aquí .
fuente
Todo el contenido
src/test/resources
se copia en latarget/test-classes
carpeta. Entonces, para obtener el archivo de los recursos de prueba durante la compilación de Maven, debe cargarlo desde latest-classes
carpeta, así:Descompostura:
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
- darle URI atarget/test-classes
.resolve(Paths.get("somefile"))
- ResuelvesomeFile
a latarget/test-classes
carpeta.La respuesta original se toma de esto
fuente
Existen diferencias y restricciones en las opciones ofrecidas por @Steve C y @ ashosborne1. Deben especificarse, creo.
¿Cuándo podemos usar
File resourcesDirectory = new File("src/test/resources");
:?IntelliJ IDEA
, pero creo que todos los IDE funcionan así. Y esta configuración que debe hacerse manualmente, no es buena en absoluto. Trabajando con varias pruebas existentes en diferentes proyectos de Maven, pero importados en un gran proyecto "IDE", nos obligan a recordar esto y no permitimos relajarnos y disfrutar de su trabajo.La solución ofrecida por @ ashosborne1 (personalmente prefiero esta) requiere 2 requisitos adicionales que deben realizarse antes de ejecutar las pruebas. Aquí hay una lista de pasos para usar esta solución:
Cree una carpeta de prueba ("teva") y un archivo ("readme") dentro de "src / test / resources /":
src / test / resources / teva / readme
El archivo debe crearse en la carpeta de prueba, de lo contrario, no funcionará. Maven ignora las carpetas vacías.
Al menos una vez construir el proyecto a través de
mvn clean install
. También ejecutará pruebas. Puede ser suficiente ejecutar solo su clase / método de prueba a través de Maven sin construir un proyecto completo. Como resultado, sus recursos de prueba se copiarán en clases de prueba, aquí hay una ruta:target/test-classes/teva/readme
Después de eso, puede acceder a la carpeta usando el código, ya ofrecido por @ ashosborne1 (lo siento, no pude editar este código dentro de esta lista de elementos correctamente):
Ahora puede ejecutar su prueba a través de IDE tantas veces como lo desee. Hasta que corras mvn limpio. Caerá la carpeta de destino.
Los pasos necesarios para crear un archivo dentro de una carpeta de prueba y ejecutar maven por primera vez, antes de ejecutar las pruebas a través de IDE. Sin estos pasos, si solo en su IDE crea recursos de prueba, luego escribe la prueba y la ejecuta solo a través de IDE, obtendrá un error. La ejecución de pruebas a través de mvn copia los recursos de prueba en target / test-classes / teva / readme y se vuelven accesibles para un cargador de clases.
Puede preguntar, ¿por qué necesito importar más de un proyecto Maven en IDE y por qué tantas cosas complicadas? Para mí, una de las principales motivaciones: mantener los archivos relacionados con IDA lejos del código. Primero creo un nuevo proyecto en mi IDE. Es un proyecto falso, que es solo un titular de archivos relacionados con IDE. Luego, importo proyectos maven ya existentes. Obligo a estos proyectos importados a mantener archivos IDEA solo en mi proyecto falso original. Como resultado, no veo archivos relacionados con IDE entre el código. SVN no debería verlos (no ofrezca configurar svn / git para ignorar dichos archivos, por favor). También es muy conveniente.
fuente
.gitignore
? También parece que IDEA ejecuta Maven automáticamente cuando ejecuta pruebas (y establece el directorio de trabajo correcto de forma predeterminada$MODULE_DIR$
). Por lo tanto, no es necesario ejecutarmvn test
manualmente antes de eso, todo funciona bien tanto de Maven como de IDEA con solo"src/test/resources/somefile.txt"
.La solución más simple y limpia que uso, supongamos que el nombre de la clase de prueba es
TestQuery1
y hay unresources
directorio en sutest
carpeta de la siguiente manera:Para obtener el URI de
TestQuery1
do:Para obtener el URI de uno de los archivos
TestQuery1
, haga lo siguiente:fuente
No puede usar un archivo de una carpeta de recursos para pruebas en un caso común. La razón es que los archivos de recursos en la carpeta de recursos se almacenan dentro de un jar. Por lo tanto, no tienen una ruta real en el sistema de archivos.
La solución más simple puede ser:
TemporaryFolder
fromJUnit
se puede usar para crear archivos temporales y eliminarlos después de completar la prueba. Clases deguava
biblioteca se utilizan para copiar una carpeta de recursos de formulario de archivo.Tenga en cuenta que si usamos una subcarpeta en la carpeta de recursos, como
good
una, no tenemos que agregar el encabezado/
a la ruta del recurso.fuente
Use lo siguiente para inyectar Hibernate con Spring en sus pruebas unitarias:
Si no tiene el
hibernate.cfg.xml
presente en susrc/test/resources
carpeta, volverá automáticamente al que está en susrc/main/resources
carpeta.fuente
Use .getAbsolutePath () en su objeto File.
fuente
getFile()
devuelva una instancia de archivo. Él dice quegetAbsolutePath()
se usa en una instancia del objeto File.Con Spring puedes leerlo fácilmente desde la carpeta de recursos (ya sea main / resources o test / resources):
Por ejemplo, crea un archivo:
test/resources/subfolder/sample.json
fuente
fuente