No se puede encontrar el archivo de propiedades dentro del contenedor durante las pruebas de Junit a través de Ant

votos
3

Tengo problemas para ejecutar mis pruebas de Junit a través de Ant. Parece que no puedo conseguir que Ant vea el archivo de propiedades que necesita para cargar un dll que necesita mi proyecto. Todas mis pruebas funcionan con la GUI de Junit en Elcipse, así que estoy bastante seguro de que no es un problema con las pruebas en sí. Creo que mi problema es algo relacionado con la ruta de clase, pero parece que no puedo encontrar el problema.

Estructura del vaso: /root/folder/../Foo.properties

Así es como se carga el archivo de propiedades en la biblioteca:

// load class properties
props = PropertyLoader.loadProperties(Foo.class);

public static Properties loadProperties(Class className) {
    return loadProperties(className.getName());
}

public static Properties loadProperties(final String propsName) {
    Properties props = null;
    InputStream in = null;
    try {
      ClassLoader cl = ClassLoader.getSystemClassLoader();
      String name = propsName.replace('.', '/').concat(.properties);

      in = cl.getResourceAsStream(name);
      if (in != null) {
        props = new Properties();
        props.load(in);
      }
    }
    catch (Exception e) {
      props = null;
    }
    finally {
      if (props == null) {
        System.err.print(Property file  + propsName +  doesn't exist. System terminated.);
        System.exit(0);
      }
    }

    return props;
  }

Excepto desde el archivo de compilación en cuestión:

<!-- Pattern of source files to copy into classpath-->
    <property name=source.files.tocopy
        value=**/*.properties,**/*.dtd,**/*.xml,**/*.jpg />

    <path id=compile.classpath>
        <fileset dir=lib>
            <include name=*.jar />
        </fileset>
    </path>

    <!-- Generate Class-Path entry for the JAR's Manifest -->
    <pathconvert property=manifest.classpath 
        pathsep=  dirsep=\>
        <map from=${basedir}/ to= />
        <fileset dir=lib>
            <include name=*.jar />
        </fileset>
    </pathconvert>

    <!-- Run tests against the JAR -->
    <path id=test.compile.classpath>
        <path refid=compile.classpath />
        <pathelement location=${target.jar} />
    </path>

    <path id=test.classpath>
        <path refid=test.compile.classpath />
        <pathelement location=${test.classes.dir} />
    </path>



    <!-- - - - - - - - - - - - - - - - - - 
          target: test-compile                      
         - - - - - - - - - - - - - - - - - -->
    <target name=test-compile depends=compile, test-init
        description=Compiles our testing code>

        <javac destdir=${test.classes.dir}
                debug=true
                includeAntRuntime=true
                srcdir=test>
            <classpath refid=test.compile.classpath />
        </javac>

        <copy todir=${test.classes.dir}>
            <fileset dir=test includes=${source.files.tocopy}/>
            <fileset dir=resources includes=${source.files.tocopy}/>
        </copy>

    </target>


    <!-- ================================= 
          target: test              
         ================================= -->
    <target name=test depends=test-compile, optional-tests>

        <description>
            Runs our tests, generates reports, and stops 
            the build on failure.  Optionally runs one test.
        </description>

        <junit printsummary=false 
            errorProperty=test.failed 
            failureProperty=test.failed>
            <classpath>
                <path refid=test.classpath />
            </classpath>            
            <sysproperty key=test.properties value=${test.properties.file}/>
            <formatter type=brief usefile=false />
            <formatter type=xml />
            <test name=${testcase} todir=${test.data.dir} if=testcase />
            <batchtest todir=${test.data.dir} unless=testcase>
                <fileset dir=${test.classes.dir}>
                    <patternset>
                        <include name=**/test/*Test.class />
                        <exclude name=**/test/*Printer*.class unless=test.properties.file />
                    </patternset>
                </fileset>
            </batchtest>
        </junit>

Realmente podría usar un segundo par de ojos, por lo que cualquier ayuda es apreciada. ¡Gracias por adelantado!

--Charly

Publicado el 07/12/2008 a las 23:37
por usuario
En otros idiomas...                            


3 respuestas

votos
2

Pruebe y use getResource para ver qué URL se devuelve en eclipse, y también vea si puede obtener una url para mostrar en la prueba unitaria. Tal vez necesite pasar el nombre del archivo de clase real para obtener ese

clazz.getResource(clazz.getName()+".class")

Compruebe que los archivos se copien antes de ejecutar la prueba unitaria, de modo que los archivos se colocan realmente en la carpeta de salida que se utiliza en la ruta de clase cuando se ejecuta la prueba unitaria.

Cuando eclipse compila archivos java, también copia todos los archivos que no son de java en el directorio de salida de forma automática. Esta es la razón por la que se puede acceder al archivo en el classpath en eclipse. Si no copia archivos que no son de Java en su carpeta de destino de compilación durante la compilación, los archivos de propiedades no se copiarán. Sin embargo, parece que a partir de sus archivos de compilación ya está copiando los archivos. ¿Puedes verificar lo mismo al navegar por las carpetas?

Además, nunca debería usar System.exit (0) en su código, excepto para programas pequeños. Es mejor tener excepciones que se propaguen a la función principal y finalicen el programa. La razón es que terminas con una biblioteca que terminará el proceso de Java cuando se usa y falla.

Respondida el 08/12/2008 a las 08:49
fuente por usuario

votos
0

Los primeros pasos de la antdepuración son siempre:

  1. ant -verbose
  2. ant -debug

Revise el resultado para aquellos objetivos que se relacionan con las junitpruebas.

Si encuentra información adicional allí que resuelve el problema, ¡genial! De lo contrario, edite la pregunta con información relevante del resultado.

Respondida el 08/12/2008 a las 14:14
fuente por usuario

votos
2

He encontrado que, en algunas circunstancias, el archivo de propiedad si está dentro del contenedor no puede estar en la carpeta raíz. Moverlo a un directorio dentro del jar y luego usar getResourceAsStream.

Karl

Respondida el 09/12/2008 a las 20:39
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more