2011-03-18 109 views
6

我試圖從Ant腳本運行JUnit測試。這些測試使用JMockit模擬框架,對於Java 5需要將其指定爲javaagent才能正確運行。這裏是我正在運行的腳本:在ant中設置javaagent

<!DOCTYPE project> 
<project name="junit_test"> 
    <property name="PROJECT_PATH" value="{Path to my eclipse project}" /> 
    <property name="LIB_PATH" value="${PROJECT_PATH}/WebContent/WEB-INF/lib" /> 
    <property name="TEST_PATH" value="WebContent/WEB-INF/classes" /> 

    <target name="run_junit"> 
     <junit fork="yes" forkmode="once" printsummary="true"> 
     <jvmarg value="-javaagent:${LIB_PATH}/jmockit.jar" /> 

     <classpath path="${LIB_PATH}/jmockit.jar" /> 
     <classpath path="${LIB_PATH}/junit-4.8.2.jar" /> 

     <batchtest> 
      <fileset dir="${TEST_PATH}"> 
       <include name="**/*Test.class"/> 
      </fileset> 
     </batchtest> 
     </junit> 

     <junitreport todir="/junitOut"> 
     <fileset dir="/junitOut"> 
      <include name="INCOMPLETE-*.xml"/> 
      <include name="TEST-*.xml"/> 
     </fileset> 
     <report todir="/junitOut/html"/> 
    </junitreport> 
</target> 
</project> 

我有一種感覺,我沒有正確設置javaagent。此例外的測試錯誤:

java.lang.reflect.InvocationTargetException 
at java.lang.reflect.Constructor.newInstance(Constructor.java:515) 
at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32) 
at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423) 
at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137) 
at java.lang.J9VMInternals.initialize(J9VMInternals.java:140) 
at java.lang.J9VMInternals.initialize(J9VMInternals.java:140) 
at java.lang.J9VMInternals.initialize(J9VMInternals.java:167) 
Caused by: java.lang.RuntimeException: com.sun.tools.attach.AttachNotSupportedException: Unable to enqueue operation: the target VM does not support attach mechanism 
at mockit.internal.startup.JDK6AgentLoader.attachToThisVM(JDK6AgentLoader.java:113) 
at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:77) 
at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:41) 
at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:203) 
at java.lang.J9VMInternals.initializeImpl(Native Method) 
at java.lang.J9VMInternals.initialize(J9VMInternals.java:200) 
at java.lang.J9VMInternals.initialize(J9VMInternals.java:167) 
at java.lang.J9VMInternals.initialize(J9VMInternals.java:167) 
Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to enqueue operation: the target VM does not support attach mechanism 
at sun.tools.attach.WindowsVirtualMachine.(WindowsVirtualMachine.java:58) 
at sun.tools.attach.WindowsAttachProvider.attachVirtualMachine(WindowsAttachProvider.java:58) 
at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:207) 
at mockit.internal.startup.JDK6AgentLoader.attachToThisVM(JDK6AgentLoader.java:110) 

我的javaagent設置是否正確?如果是,還有什麼可能導致這個錯誤?

回答

0

我不知道這是否是解決方案,但是您沒有正確設置類路徑。試試這個:

<classpath> 
    <pathelement location="${LIB_PATH}/jmockit.jar" /> 
    <pathelement location="${LIB_PATH}/junit-4.8.2.jar" /> 
</classpath> 
+0

這並沒有解決它,但感謝指針。我仍然認識螞蟻。 – 2011-03-18 14:19:03

0

jvmargAntjavaagent看起來是正確的。您正在使用Java 6還是支持Attach API的JVM?看起來您還必須通過-Dcom.sun.management.jmxremote才能在舊版本的Java中啓用它。我假設你需要它,因爲異常說「目標虛擬機不支持附加機制」。

對於IBM JDK 6,您需要指定-Dcom.ibm.tools.attach.enable=yes

+0

我嘗試了你的建議,並沒有改變我的輸出。奇怪的是,我可以使用Eclipse的JUnit運行器運行測試,並且它可以在javaagent中正常運行。繼續尋找...... – 2011-03-18 18:19:56

+0

堆棧跟蹤引用了'J9VMInternals',它看起來像是在使用IBM JDK?也許該版本不支持Attach API,並且您正在爲Eclipse使用不同的JDK。我現在推薦Sun(Oracle)JDK 6,它是最新更新的最快版本。 – WhiteFang34 2011-03-18 18:22:42

+0

我擁有的Eclipse技術上是IBM的Rational Application Developer :)我不知道它是否支持Attach API,但我必須在我的JUnit運行配置中使用javaagent,因此可能不會。這個IBM JDK *應該是* Java 6兼容的。不幸的是,交換不是出於商業原因的選擇。 – 2011-03-18 18:26:32