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.класс)
который решил проблему, согласно документации в принятом ответе.
я настраиваю файл свойств в пути к классам для легкой настройки 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