JMockit — проблема с инициализацией

Когда я использую следующий тест, я получаю ПРЕДУПРЕЖДЕНИЕ:

ВНИМАНИЕ: JMockit был инициализирован по запросу, что может привести к сбою некоторых тестов; пожалуйста, проверьте документацию, чтобы узнать о лучших способах инициализации.

Это моя тестовая реализация:

package test;

import static mockit.Mockit.*;
import junit.framework.TestCase;
import mockit.*;
import mockit.integration.junit4.*;


import org.junit.*;
import org.junit.runner.*;

import filip.ClassUnderTest;
import filip.LowerClass;

@RunWith(JMockit.class)
public class MockTest extends TestCase {

    @MockClass(realClass = LowerClass.class)
    public static class LowerClassMock {
        @Mock(invocations = 1)
        public String doWork() {
            return "Mockowanie dziala :D";
        }
    }

    @Before
    public void setUp() { setUpMocks(LowerClassMock.class); }

    @After
    public void tearDown() { tearDownMocks(); }

    @Test
    public void testJMockit() {
        ClassUnderTest classUnderTest = new ClassUnderTest();

        classUnderTest.print();
    }

}

Любые идеи?


person Filip    schedule 25.05.2010    source источник


Ответы (8)


Насколько я понимаю, это исключение выбрасывается при попытке вызвать метод JMockit, когда JMockit не был должным образом инициализирован.

Обязательно следуйте инструкциям по установке JMockit, особенно пунктам 3 и 4. Если JMockit jar идет после JUnit jar в пути к классам, это может вызвать проблемы.

person Etienne Neveu    schedule 25.05.2010
comment
Кажется, что при использовании встроенных библиотек eclipse возникают проблемы с JMockit. Решение состоит в том, чтобы добавить внешнюю и отдельную банку JUnit. - person Filip; 26.05.2010
comment
Ссылка на инструкции по установке JMockit в этом принятом ответе не работает! - person fatuhoku; 14.08.2012
comment
@FatuHoku Спасибо. Обновил ссылку. - person Etienne Neveu; 19.08.2012
comment
Была такая же проблема, пункт 4 был правильным для меня. (Мне пришлось изменить порядок моих зависимостей Maven) - person Bevor; 20.10.2012
comment
У меня была аналогичная проблема с Spring Boot. Убедитесь, что у вас нет библиотеки JUnit, включенной в путь сборки. У меня была библиотека JUnit, включенная в мой путь сборки, и зависимости JUnit и JMockit (JMockit предшествует JUnit) в моем pom.xml. Удаление дополнительной библиотеки JUnit из пути сборки решило мою проблему. - person visrahane; 07.07.2017
comment
Указатель на инструкции по установке JMockit был очень полезен ‹/br› Часть, которую нужно пройти maven argline с javaagent сразу решил мои проблемы. Нет необходимости иметь @RunWith(JMockit.class). Невозможно, если у вас уже есть SpringRunner.class, использующий это. - person PeriChandra; 29.06.2020

Принятый ответ немного устарел в отношении ссылок, поэтому стоит напрямую упомянуть различные решения.

Чтобы решить эту проблему, выполните одно из следующих действий:

1 – указать агент Java

Добавьте это в свою среду выполнения JUnit (для вашей версии):

 -javaagent:path/to/your/jmockit/jmockit-0.998.jar 

2 — настройте подключаемый модуль Surefire в Maven, чтобы избежать этого

Добавьте следующее в свою конфигурацию Maven (выберите свои собственные версии)

<!-- JMockit must be before JUnit in the classpath -->
<dependency>
  <groupId>mockit</groupId>
  <artifactId>jmockit</artifactId>
</dependency>
<!-- Standard unit testing -->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
</dependency>

Убедитесь, что ваш подключаемый модуль Surefire настроен следующим образом (для ваших конкретных версий):

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>2.4.3</version>
   <configuration>
      <argLine>-javaagent:${settings.localRepository}/mockit/jmockit/0.998/jmockit-0.998.jar</argLine>
      <useSystemClassLoader>true</useSystemClassLoader>
    </configuration>
 </plugin>

3. Используйте аннотацию JUnit @RunWith

Добавьте эту аннотацию JUnit runner для каждого тестового класса.

@RunWith(JMockit.class)
public class ExampleTest {}
person Gary Rowe    schedule 06.12.2010
comment
Я использую maven, поэтому я пытаюсь использовать вариант 2. Однако, несмотря на то, что jmockit является первой зависимостью в моем pom, а плагин surefire настроен на использование -javaagent argLine, я все еще получаю инициализацию по запросу предупреждение. Я использую surefire 2.6 и jmockit 0.999.4. Любые идеи? - person Greg; 07.01.2011
comment
Возможно, в сочетании с вариантом 3? - person Gary Rowe; 07.01.2011
comment
@GregInYEG, у тебя когда-нибудь это работало? У меня точно такая же проблема. - person Ilkka; 19.03.2011
comment
@likka Возможно, стоит обновить версию jmockit до последней версии, которая решает ряд подобных проблем. - person Gary Rowe; 19.03.2011
comment
Спасибо. # 3 — это то, что помогло мне работать под IntelliJ. - person Domenic D.; 10.12.2013
comment
Вариант № 2 работал как шарм (т.е. без применения вариантов 1 и/или 3). - person berezovskyi; 18.07.2014
comment
По какой-то причине JMockit внезапно начал зависать, когда я запускал свои тесты в IntelliJ, но благодаря # 3 теперь он работает. - person Jonathan; 13.01.2016
comment
# 3 не работает в сочетании с JUnitParams или любой другой библиотекой, требующей использования RunWith. - person Novaterata; 10.07.2017

В дополнение к решению Гэри Роу:

Более надежная (т.е. независимая от версии и пути репозитория) интеграция JMockit в Surefire была бы

<argLine>-javaagent:${org.jmockit:jmockit:jar}

Чтобы это разрешение работало, плагин maven-dependency-plugin (версия >= 2.5.1!) должен быть настроен следующим образом:

<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
    <execution>
        <id>getClasspathFilenames</id>
        <goals>
            <goal>properties</goal>
        </goals>
    </execution>
</executions>

person Peter Wippermann    schedule 11.03.2015

Я установил файл свойств в пути к классам для легкой настройки Junit 5:

Он ДОЛЖЕН называться junit-platform.properties.

junit.jupiter.extensions.autodetection.enabled = true
junit.jupiter.testinstance.lifecycle.default = per_class

Убедитесь, что вы используете более новую версию Jmockit, в которой есть класс JmockitExtension. ПРИМЕЧАНИЕ. Jmockit версии 1.8 НЕ новее версии 1.41. Версия 1.8 должна была быть 1.08.

Ссылка на Maven Central: https://mvnrepository.com/artifact/org.jmockit/jmockit

person TheJeff    schedule 01.08.2018
comment
Проголосовал за то, что указал, что 1,41 больше, чем 1,8. На самом деле его нужно было назвать 1.08, чтобы избежать путаницы. - person Paco Abato; 12.05.2020

Я просто добавил:

@RunWith(JMockit.класс)

Что решило проблему, согласно документации в принятом ответе.

person Benjamin Slabbert    schedule 07.05.2017
comment
Это не будет работать с JUnitParams или любой другой вещью, для которой требуется RunWith. - person Novaterata; 10.07.2017

Он все еще не работает для меня в IntelliJ. Я могу запустить его из командной строки.

person Ronn Macc    schedule 16.08.2017

У меня не было проблем с запуском тестов в Maven, но я получил ту же ошибку, когда запускал их в eclipse.

Плагин JMockit Eclipse позволил мне запустить все тесты в eclipse без дополнительной настройки.

https://marketplace.eclipse.org/content/jmockit-eclipse

Одной из особенностей этого плагина является

Автоматически добавляет JMockit jar в качестве аргумента -javaagent для запуска JUnit.

person Peter Lustig    schedule 25.02.2020

Для ошибки VSCode JMockito -

Вам нужно будет создать файл settings.json с java. test.config в нем.

В этом файле добавьте:

"java.test.config": [
    {
        "name": "myConfiguration",
        "workingDirectory": "${workspaceFolder}",

        "vmargs": [ 
          "-Xmx512M", //this was here by default
          "-javaagent:/path/to/jmockito/" 
        ]
    ]
person Shivansh Jagga    schedule 04.06.2021