2011-06-10 1 views
12

Ho un progetto Java che utilizza this driver per la comunicazione seriale. Il driver utilizza una DLL in Windows per creare porte seriali.Come aggiungere un percorso della libreria nativa all'attività JUNIT?

Il progetto contiene diversi test JUnit che vengono completati correttamente utilizzando "Esegui come -> Test JUnit". Tuttavia, i test che fanno riferimento alla libreria nativa non riescono quando si esegue ant (e test che non fanno riferimento al passaggio della libreria nativa).

La mia ipotesi migliore è quella di aggiungere la directory che contiene la libreria nativa a java.library.path, ma non sono riuscito a farlo attraverso il file build.xml.

Qualcuno può dire una soluzione (pulita)?

Ecco il mio 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> 

E qui è una parte del rapporto di prova (in 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) 

risposta

13

Il junit task in Ant, permetterà di impostare le proprietà del sistema, proprio come alcuni degli altri compiti. È necessario specificare il valore java.library.path nell'elemento nidificato sysproperty come:

<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

Grazie per la risposta! Questo sostituisce il percorso, giusto? Come posso ** aggiungere ** la mia directory al percorso (percorso = percorso + nuova dir;)) – Timo

+0

@Timo, potresti trovare il [pathconvert] (http://ant.apache.org/manual/Tasks/pathconvert .html) compito per essere utile a tale scopo. Vedi [questa domanda SO] (http://stackoverflow.com/questions/2140637/how-do-i-build-a-list-of-file-names), pure. –

+4

' ' Funzionerebbe anche questo? – Timo

5

Utilizzare un jvmarg per impostare il percorso di carico libreria:

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

Se si desidera aggiungere la directory al percorso esistente, è necessario utilizzare Ant's ability to use environment variables:

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

Grazie per la risposta! Questo sostituisce il percorso, giusto? Come posso ** aggiungere ** la mia directory al percorso (percorso = percorso + nuova dir;)) – Timo

+0

Ci scusiamo per la risposta lenta. Se non l'avessi ancora trovato l'ho aggiunto alla risposta –

+0

Va notato che l'attributo fork = "yes" è richiesto per far funzionare questa soluzione! –