java - una - ¿Cómo obtener la ruta del directorio src/test/resources en JUnit?
ruta de una carpeta en java (11)
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?
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");
?
- 1 Cuando las pruebas se ejecutarán solo a través de Maven pero no a través de IDE.
- 2.1 Cuando las pruebas se ejecutarán a través de Maven o
- 2.2 a través de IDE y solo se importa un proyecto a IDE. (Uso el término "importado", porque se usa en IntelliJ IDEA. Creo que los usuarios de eclipse también importan su proyecto maven). Esto funcionará, porque el directorio de trabajo cuando ejecuta pruebas a través de IDE es el mismo que su proyecto.
- 3.1 Cuando las pruebas se ejecutarán a través de Maven o
-
3.2 a través de IDE, y se importan más de un proyecto a IDE (cuando no es un estudiante, generalmente importa varios proyectos),
y
antes de ejecutar pruebas a través de IDE, configura manualmente el directorio de trabajo para sus pruebas.
Ese directorio de trabajo debe referirse a su proyecto importado que contiene las pruebas.
Por defecto, el directorio de trabajo de todos los proyectos importados en IDE es solo uno.
Probablemente es una restricción de
IntelliJ IDEA
solamente, 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, compilar 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):
public static final String TEVA_FOLDER = "teva"; ... URL tevaUrl = YourTest.class.getClassLoader().getResource(TEVA_FOLDER); String tevaTestFolder = new File(tevaUrl.toURI()).getAbsolutePath();
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.
Intente trabajar con la clase
ClassLoader
:
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("somefile").getFile());
System.out.println(file.getAbsolutePath());
Un
ClassLoader
es responsable de cargar en las clases.
Cada clase tiene una referencia a un
ClassLoader
.
Este código devuelve un
File
del directorio de recursos.
Llamar a
getAbsolutePath()
en él devuelve su
Path
absoluta.
Javadoc para
ClassLoader
:
http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html
La solución más simple y limpia que uso, supongamos que el nombre de la clase de prueba es
TestQuery1
y que hay un directorio de
resources
en su carpeta de
test
siguiente manera:
├── java
│ └── TestQuery1.java
└── resources
└── TestQuery1
├── query.json
└── query.rq
Para obtener el URI de
TestQuery1
haz:
URL currentTestResourceFolder = getClass().getResource("/"+getClass().getSimpleName());
Para obtener el URI de uno de los archivos
TestQuery1
, haga:
File exampleDir = new File(currentTestResourceFolder.toURI());
URI queryJSONFileURI = exampleDir.toURI().resolve("query.json");
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:
File resourcesDirectory = new File("src/test/resources");
resourcesDirectory.getAbsolutePath()
devolverá el valor correcto si eso es lo que realmente necesita.
Recomiendo crear un directorio
src/test/data
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.
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:
- Copie un archivo de los recursos a la carpeta temporal y obtenga una ruta a ese archivo temporal.
- Haz pruebas usando una ruta temporal.
- Eliminar el archivo temporal.
TemporaryFolder
de
JUnit
se puede usar para crear archivos temporales y eliminarlos después de completar la prueba.
Las clases de la biblioteca de
guava
se utilizan para copiar una carpeta de recursos de formulario de archivo.
Tenga en cuenta que si utilizamos una subcarpeta en la carpeta de recursos, como una
good
, no tenemos que agregar el inicio
/
a la ruta del recurso.
public class SomeTest {
@Rule
public TemporaryFolder tmpFolder = new TemporaryFolder();
@Test
public void doSomethinge() throws IOException {
File file = createTmpFileFromResource(tmpFolder, "file.txt");
File goodFile = createTmpFileFromResource(tmpFolder, "good/file.txt");
// do testing here
}
private static File createTmpFileFromResource(TemporaryFolder folder,
String classLoaderResource) throws IOException {
URL resource = Resources.getResource(classLoaderResource);
File tmpFile = folder.newFile();
Resources.asByteSource(resource).copyTo(Files.asByteSink(tmpFile));
return tmpFile;
}
}
Si se trata de un proyecto de primavera, podemos usar el siguiente código para obtener archivos de la carpeta src / test / resource .
File file = ResourceUtils.getFile(this.getClass().getResource("/some_file.txt"));
Simplemente usaría
Path
from Java 7
Path resourceDirectory = Paths.get("src","test","resources");
¡Limpio y ordenado!
Tengo un proyecto Maven3 usando JUnit 4.12 y Java8.
Para obtener la ruta de un archivo llamado
myxml.xml
en
src/test/resources
, hago esto desde el caso de prueba:
@Test
public void testApp()
{
File inputXmlFile = new File(this.getClass().getResource("/myxml.xml").getFile());
System.out.println(inputXmlFile.getAbsolutePath());
...
}
Probado en Ubuntu 14.04 con IntelliJ IDE. Referencia here
Todo el contenido en
src/test/resources
se copia en la carpeta
target/test-classes
.
Entonces, para obtener el archivo de los recursos de prueba durante la compilación de Maven, debe cargarlo desde la carpeta
test-classes
, así:
Paths.get(
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
).resolve(
Paths.get("somefile")
).toFile()
Descompostura:
-
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
- le da URI atarget/test-classes
. -
resolve(Paths.get("somefile"))
: resuelvesomeFile
en lasomeFile
target/test-classes
.
La respuesta original se toma de this
Use .getAbsolutePath () en su objeto File.
getClass().getResource("somefile").getFile().getAbsolutePath()
Use lo siguiente para inyectar Hibernate con Spring en sus pruebas unitarias:
@Bean
public LocalSessionFactoryBean getLocalSessionFactoryBean() {
LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
localSessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
localSessionFactoryBean.setPackagesToScan("com.example.yourpackage.model");
return localSessionFactoryBean;
}
Si no tiene el
hibernate.cfg.xml
presente en su carpeta
src/test/resources
, volverá automáticamente al que está en su carpeta
src/main/resources
.