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();
    }

}

какие идеи?

6 ответов


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

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


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

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

1-Specifiy javaagent

добавьте это в среду выполнения 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 {}

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

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

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

чтобы это разрешение работало, плагин Maven-dependency (версия >= 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>


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

@RunWith(JMockit.класс)

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


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


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

Это должны назовите junit-платформу.свойства

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: https://mvnrepository.com/artifact/org.jmockit/jmockit