2012-08-30 107 views
4

當我嘗試使用IBM JDK運行簡單的jMockit/JUnit測試時,出現以下異常。有沒有人遇到過這個問題?我試着給出-Dcom.ibm.tools.attach.enable=yes作爲VM的參數,但沒有運氣。 Sun JDK中相同的代碼工作正常。在IBM JRE上運行jMockit測試時出現AttachNotSupportedException

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.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:89) 
    at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54) 
    at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21) 
    at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:98) 
    at mockit.internal.startup.Startup.initializeIfPossible(Startup.java:112) 
    at org.junit.runner.Runner.<clinit>(Runner.java:22) 
    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) 
    at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:13) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to enqueue operation: the target VM does not support attach mechanism 
    at sun.tools.attach.WindowsVirtualMachine.<init>(WindowsVirtualMachine.java:64) 
    at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:73) 
    ... 22 more 
java.lang.NoClassDefFoundError: org.junit.internal.runners.ErrorReportingRunner (initialization failure) 
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:140) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: java.lang.NoClassDefFoundError: org.junit.runner.Runner (initialization failure) 
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:140) 
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:167) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) 
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
    ... 9 more 
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.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:89) 
    at mockit.internal.startup.JDK6AgentLoader.loadAgent(JDK6AgentLoader.java:54) 
    at mockit.internal.startup.AgentInitialization.initializeAccordingToJDKVersion(AgentInitialization.java:21) 
    at mockit.internal.startup.Startup.initializeIfNeeded(Startup.java:98) 
    at mockit.internal.startup.Startup.initializeIfPossible(Startup.java:112) 
    at org.junit.runner.Runner.<clinit>(Runner.java:22) 
    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) 
    at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:13) 
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57) 
    ... 11 more 
Caused by: com.sun.tools.attach.AttachNotSupportedException: Unable to enqueue operation: the target VM does not support attach mechanism 
    at sun.tools.attach.WindowsVirtualMachine.<init>(WindowsVirtualMachine.java:64) 
    at mockit.internal.startup.JDK6AgentLoader.getVirtualMachineImplementationFromEmbeddedOnes(JDK6AgentLoader.java:73) 
    ... 22 more 

我試圖給VM參數-javaagent:jmockit.jar由凱文·韋爾克的建議,我得到了下面的異常。

Exception in thread "main" java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:600) 
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:335) 
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:350) 
Caused by: java.lang.NullPointerException 
    at mockit.internal.annotations.MockClassSetup.validateRealClass(MockClassSetup.java:59) 
    at mockit.internal.annotations.MockClassSetup.<init>(MockClassSetup.java:38) 
    at mockit.internal.annotations.MockClassSetup.<init>(MockClassSetup.java:77) 
    at mockit.internal.annotations.MockClassSetup.<init>(MockClassSetup.java:99) 
    at mockit.internal.startup.JMockitInitialization.setUpInternalStartupMock(JMockitInitialization.java:56) 
    at mockit.internal.startup.JMockitInitialization.initialize(JMockitInitialization.java:29) 
    at mockit.internal.startup.Startup.initialize(Startup.java:68) 
    at mockit.internal.startup.Startup.premain(Startup.java:56) 
    ... 6 more 

Fatal error: processing of -javaagent failed 
+0

我只想問你,如果你使用的示例的命令行編譯你的單元測試? – Abderrahim

回答

8

的附加API只需在IBM JDK 6.0不起作用,至少在Windows上。因此,有必要使用-javaagent:jmockit.jar參數。

發生在MockClassSetup.java:59(使用-javaagent)時發生的NullPointerException是由IBM JDK中的錯誤引起的。當在註釋屬性(本例中爲@MockClass)中引用的類型不在類路徑中時,JDK應該拋出TypeNotPresentException。 Oracle JDK按預期執行操作,但IBM JDK返回null而不是屬性值。

我剛在9月底之前在下一個JMockit版本中提供了類MockClassSetup的解決方法。現在,您可以通過將TestNG添加到類路徑中來避免此問題(因爲「未找到類型」是org.testng.TestNG類)。

+0

太棒了!我添加了TestNG依賴關係,它工作!非常感謝Rogerio。 –

1

某些版本的IBM JDK不能正確支持連接機制。您可以嘗試使用-javaagent:jmockit.jar參數運行。以下信息有點舊,但仍可能適用,因爲其他JDK不一定完全支持附加機制。

看到這個:http://code.google.com/p/jmockit/issues/detail?id=18

+0

我試着給-javaagent:jmockit.jar。但我得到了一個不同的例外。我已經更新了我的帖子。 –

+0

您的類路徑中是否有來自IBM JDK的tools.jar?這是我給出的鏈接中列出的另一個項目。 –

0

我也嘗試使用JMockit來覆蓋第三方庫中的類中的最終方法。我得到了上面討論的同樣的問題,並且再次添加VM arg -javaagent:C:/<Path-to-jar>/jmockit.jar只給了我一個不同類型的錯誤。我也在使用Websphere附帶的IBM JDK 6.0。這是一種遺憾,但它看起來像覆蓋最終方法是不可能的:我找不到任何其他可以做到的測試框架。

+0

事實上,我確實在Windows 7上運行了IBM RAD 8.5。我只需要將我的JUnit.jar版本升級到4.11,然後運行。 – nzcoder

2

以上回答使用-javaagent是正確的。如果你正在使用maven這是一個有點棘手,所以這裏是我是如何做的:

  1. 添加Maven的依賴,插件,這樣你就可以產生絕對路徑依賴:
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.5.1</version> 
    <executions> 
    <execution> 
     <id>getClasspathFilenames</id> 
     <goals> 
     <goal>properties</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

2.添加-javaagent來保命插件

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.13</version> 
    <configuration> 
    <argLine>-javaagent:${com.googlecode.jmockit:jmockit:jar} -XX:-UseSplitVerifier</argLine> 
    </configuration> 
</plugin> 

3.還有,你沒有到,但我建議使用相對較新版本的jmockit。在1.1(之前的2012年9月通過修復@羅熱檢測到此問題,但無論加入-javaagent修復它作爲參考。我正在使用可用的最新版本的Maven中央(2.5)作爲此評論的:

<dependency> 
    <groupId>com.googlecode.jmockit</groupId> 
    <artifactId>jmockit</artifactId> 
    <!-- Use latest version. 1.1 gives AttachNotSupportedException --> 
    <version>1.5</version> 
    <scope>test</scope> 
</dependency> 
0

你只需要將JDK更新到1.8,我測試了這個版本的JDK,這個問題已經解決了。

0

爲javagent的萬無一失使用maven的設置是這樣的:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.18.1</version> 
    <configuration> 
     .... 
     <argLine>-javaagent:"${settings.localRepository}"/org/jmockit/jmockit/1.11/jmockit-1.11.jar</argLine> 
    </configuration> 
    </plugin> 

上述假定您使用以下依賴性:

<dependency> 
    <groupId>org.jmockit</groupId> 
    <artifactId>jmockit</artifactId> 
    <version>1.11</version> 
    <scope>test</scope> 
    </dependency> 

如果您使用的是不同的版本,然後修改argLine值適當。

來源:http://jmockit.googlecode.com/svn-history/r1166/trunk/www/installation.html

相關問題