2011-06-10 6 views
12

Tengo un proyecto de Java que usa this driver para comunicación serial. El controlador usa un dll en Windows para crear puertos serie.¿Cómo agregar una ruta de biblioteca nativa a la tarea JUNIT?

El proyecto contiene varias pruebas de JUnit que se completan satisfactoriamente con la prueba "Ejecutar como -> JUnit". Sin embargo, las pruebas que hacen referencia a la biblioteca nativa fallan cuando se ejecuta ant (y las pruebas que no hacen referencia al pase de la biblioteca nativa).

Mi mejor estimación hasta ahora es agregar el directorio que contiene la biblioteca nativa a java.library.path, pero no lo he logrado a través del archivo build.xml.

¿Alguien puede decir una solución (limpia)?

Aquí es mi build.xml:

<path id="compile.classpath"> 
    <fileset dir="${lib}"> 
     <include name="**/*.jar"/> 
    </fileset> 
    <fileset dir="${junit_home}"> 
     <include name="**/*.jar"/> 
    </fileset> 
</path> 

<path id="test.classpath"> 
    <pathelement location="${bin}" /> 
    <fileset dir="${lib}"> 
     <include name="**/*.jar"/> 
    </fileset> 
    <fileset dir="${junit_home}"> 
     <include name="**/*.jar"/> 
    </fileset> 
</path> 

<target name="compile"> 
    <mkdir dir="${bin}" /> 
    <echo Message="Compiling src folder..." /> 
    <javac includeantruntime="no" classpathref="compile.classpath" srcdir="${src}" destdir="${bin}" /> 
    <echo Message="Compiling test folder..." /> 
    <javac includeantruntime="no" classpathref="compile.classpath" srcdir="${test}" destdir="${bin}" /> 
</target> 

<target name="test"> 
    <mkdir dir="${test.reports}" /> 
    <junit fork="yes" printsummary="yes" haltonfailure="yes"> 
     <test name="${test.class.name}" todir="${test.reports}" /> 
     <formatter type="xml" /> 
     <classpath refid="test.classpath" /> 
    </junit> 
</target> 

Y aquí es una parte del informe de la prueba (en XML):

<testcase classname="nl.timo.comport.test.buildservertests.ComportFactoryTest" name="testGetInstance" time="0.0" /> 
    <testcase classname="nl.timo.comport.test.buildservertests.ComportFactoryTest" name="testCreateDefaultComport" time="0.016"> 
    <error message="giovynet.nativelink.SerialPort.getStateSerialPortC(Ljava/lang/String;)Ljava/lang/String;" type="java.lang.UnsatisfiedLinkError">java.lang.UnsatisfiedLinkError: giovynet.nativelink.SerialPort.getStateSerialPortC(Ljava/lang/String;)Ljava/lang/String; 
    at giovynet.nativelink.SerialPort.getStateSerialPortC(Native Method) 
    at giovynet.nativelink.SerialPort.getFreeSerialPort(SerialPort.java:50) 
    at package.comport.GioComport.getFreeSerialPorts(Unknown Source) 
    at package.comport.GioComport.findDevice(Unknown Source) 
    at package.comport.GioComport.&lt;init&gt;(Unknown Source) 
    at package.comport.ComportFactory.createNewPort(Unknown Source) 
    at package.comport.ComportFactory.createComport(Unknown Source) 
    at package.comport.test.buildservertests.ComportFactoryTest.testCreateDefaultComport(Unknown Source) 
</error> 
    </testcase> 
    <testcase classname="nl.timo.comport.test.buildservertests.ComportFactoryTest" name="testCreateComportWithWrongSettings" time="0.0"> 
    <error message="giovynet.nativelink.SerialPort.getStateSerialPortC(Ljava/lang/String;)Ljava/lang/String;" type="java.lang.UnsatisfiedLinkError">java.lang.UnsatisfiedLinkError: giovynet.nativelink.SerialPort.getStateSerialPortC(Ljava/lang/String;)Ljava/lang/String; 
    at giovynet.nativelink.SerialPort.getStateSerialPortC(Native Method) 
    at giovynet.nativelink.SerialPort.getFreeSerialPort(SerialPort.java:50) 
    at package.comport.GioComport.getFreeSerialPorts(Unknown Source) 
    at package.comport.GioComport.findDevice(Unknown Source) 
    at package.comport.GioComport.&lt;init&gt;(Unknown Source) 
    at package.comport.ComportFactory.createNewPort(Unknown Source) 
    at package.comport.ComportFactory.createComport(Unknown Source) 
    at package.comport.test.buildservertests.ComportFactoryTest.testCreateComportWithWrongSettings(Unknown Source) 
</error> 
    </testcase> 
    <system-out><![CDATA[]]></system-out> 
    <system-err><![CDATA[java.lang.UnsatisfiedLinkError: no libSerialPort in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738) 

Respuesta

13

El junit task in Ant, permitirá establecer las propiedades del sistema, al igual que algunas de las otras tareas. Tendrá que especificar el valor java.library.path en el elemento anidado sysproperty como:

<junit fork="yes" printsummary="yes" haltonfailure="yes"> 
    <test name="${test.class.name}" todir="${test.reports}" /> 
    <formatter type="xml" /> 
    <classpath refid="test.classpath" /> 
    <sysproperty key="java.library.path" value="put your library path here"/> 
</junit> 
+0

¡Gracias por la respuesta! Esto reemplaza el camino, ¿verdad? ¿Cómo puedo ** agregar ** mi directorio a la ruta (ruta = ruta + nuevo directorio;)) – Timo

+0

@Timo, puede encontrar el [pathconvert] (http://ant.apache.org/manual/Tasks/pathconvert .html) tarea para ser útil para ese propósito. Ver [esta pregunta SO] (http://stackoverflow.com/questions/2140637/how-do-i-build-a-list-of-file-names), también. –

+4

' ' ¿Esto también funcionaría? – Timo

5

Utilice un jvmarg para establecer la ruta de carga de biblioteca:

<junit> 
    <jvmarg value="-Djava.library.path=/blah/YOURPATH"/> 

Si desea agregar su directorio a la ruta existente, necesitará usar Ant's ability to use environment variables:

<property environment="env"/> 
<junit> 
    <jvmarg value="-Djava.library.path=${env.path}${path.separator}/blah/PATH"/> 
+0

Gracias por la respuesta! Esto reemplaza el camino, ¿verdad? ¿Cómo puedo ** agregar ** mi directorio a la ruta (path = path + new dir;)) – Timo

+0

Disculpe por la respuesta lenta. Si aún no lo ha encontrado, lo he agregado a la respuesta –

+0

. ¡Cabe señalar que el atributo fork = "yes" es necesario para que esta solución funcione! –

Cuestiones relacionadas