4

IBM JDK を使用して単純な jMockit/JUnit テストを実行しようとすると、以下の例外が発生します。誰もこの問題に直面しましたか? -Dcom.ibm.tools.attach.enable=yesVM引数として与えてみましたが、うまくいきませんでした。同じコードが Sun JDK で正常に動作しています。

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

-javaagent:jmockit.jarKevin Welker の提案に従ってVM 引数を指定しようとしましたが、以下の例外が発生しました。

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
4

6 に答える 6

9

Attach API は、少なくとも Windows では、IBM JDK 6.0 では機能しません。したがって、-javaagent:jmockit.jarパラメータを使用する必要があります。

を使用しているときにNullPointerExceptionで発生するは、IBM JDK のバグが原因です。アノテーション属性 (この場合は ) で参照される型がクラスパスに存在しない場合、JDK は. Oracle JDK は期待どおりに動作しますが、IBM JDK は代わりに属性値を返します。MockClassSetup.java:59-javaagent@MockClassTypeNotPresentExceptionnull

MockClassSetup9 月末までに次の JMockit リリースで利用可能になる予定の class で、これに対する回避策を実装しました。今のところ、クラスパスに TestNG を追加することで問題を回避できます (「タイプが見つかりません」がorg.testng.TestNGクラスであるため)。

于 2012-08-31T16:37:36.297 に答える
2

-javaagent を使用する上記の回答は正しいです。Maven を使用している場合は少しトリッキーなので、私が行った方法は次のとおりです。

  1. 依存関係への絶対パスを生成できるように、maven-dependency-plugin を追加します。
<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>

-javaagent2.surefireプラグインに追加

<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 で検出されました (@Rogério による 2012 年 9 月の修正より前ですが、-javaagent を追加すると修正されます。参考までに、このコメントの時点で maven central (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>
于 2013-12-05T16:30:46.620 に答える
1

IBM JDK の特定のバージョンは、アタッチ メカニズムを適切にサポートしていません。-javaagent:jmockit.jar パラメータを指定して実行してみてください。次の情報は少し古いですが、他の JDK は接続メカニズムを必ずしも完全にサポートしていないため、まだ適用される可能性があります。

これを参照してください: http://code.google.com/p/jmockit/issues/detail?id=18

于 2012-08-31T03:03:02.237 に答える
0

maven を使用した Surefire の javagent のセットアップは次のようになります。

 <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

于 2015-01-26T15:50:42.950 に答える