AttachNotSupportedException при выполнении тестов jMockit на IBM JRE

Я получаю следующее исключение, когда пытаюсь запустить простой тест jMockit/JUnit с использованием IBM JDK. Кто-нибудь сталкивался с этой проблемой? Я пробовал использовать -Dcom.ibm.tools.attach.enable=yes в качестве аргумента виртуальной машины, но безуспешно. Тот же код отлично работает в 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.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

person Nithin Satheesan    schedule 30.08.2012    source источник
comment
Я просто хочу спросить вас, использовали ли вы, например, командную строку для компиляции вашего модульного теста?   -  person Abderrahim    schedule 07.11.2016


Ответы (6)


Attach API просто не работает в IBM JDK 6.0, по крайней мере, в Windows. Поэтому необходимо использовать параметр -javaagent:jmockit.jar.

NullPointerException, возникающее в MockClassSetup.java:59 при использовании -javaagent, вызвано ошибкой в ​​IBM JDK. Когда тип, указанный в атрибуте аннотации (в данном случае @MockClass), отсутствует в пути к классам, JDK должен выдать ошибку TypeNotPresentException. Oracle JDK делают это, как и ожидалось, но IBM JDK вместо этого возвращает null для значения атрибута.

Я только что реализовал обходной путь для этого в классе MockClassSetup, который будет доступен в следующем выпуске JMockit к концу сентября. На данный момент вы можете избежать этой проблемы, добавив TestNG в путь к классам (поскольку «тип не найден» — это класс org.testng.TestNG).

person Rogério    schedule 31.08.2012
comment
Потрясающий! Я добавил зависимость TestNG, и это сработало! Большое спасибо Роджерио. - person Nithin Satheesan; 04.09.2012

Выше ответ на использование -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>

2. Добавьте -javaagent в плагин 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 года, но добавление -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>
person Domenic D.    schedule 05.12.2013

Некоторые версии IBM JDK неправильно поддерживают механизм присоединения. Вы можете попробовать запустить с параметром -javaagent:jmockit.jar. Следующая информация немного устарела, но она все еще может применяться, поскольку другие JDK не обязательно полностью поддерживают механизм присоединения.

См. это: http://code.google.com/p/jmockit/issues/detail?id=18

person Kevin Welker    schedule 31.08.2012
comment
Я попытался указать -javaagent:jmockit.jar. Но у меня другое исключение. Я обновил свой пост с этим. - person Nithin Satheesan; 31.08.2012
comment
У вас тоже есть tools.jar из IBM JDK в пути к классам? Это был еще один пункт, указанный в ссылке, которую я дал. - person Kevin Welker; 31.08.2012

Я также пытался использовать JMockit для переопределения конечных методов в классе в сторонней библиотеке. У меня возникла та же проблема, о которой говорилось выше, и снова добавление аргумента виртуальной машины -javaagent:C:/<Path-to-jar>/jmockit.jar дало мне только другой тип ошибки. Я также использую IBM JDK 6.0, который поставляется с Websphere. Обидно, но похоже, что переопределить окончательные методы невозможно: я не могу найти другой фреймворк для тестирования, который может это сделать.

person nzcoder    schedule 19.06.2013
comment
На самом деле я заставил его работать, по крайней мере, в Windows 7, работая с IBM RAD 8.5. Мне просто нужно было обновить версию JUnit.jar до 4.11, и тогда это сработало. - person nzcoder; 25.06.2013

Вам просто нужно обновить JDK до 1.8. Я протестировал эту версию JDK, и эта проблема была решена.

person Carl    schedule 04.11.2014

Настройка javagent для surefire с использованием 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

person cjackson    schedule 26.01.2015