Reputation: 443
When I use the following test I get a WARNING:
WARNING: JMockit was initialized on demand, which may cause certain tests to fail; please check the documentation for better ways to get it initialized.
This is my test implemenation:
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();
}
}
Any ideas?
Upvotes: 34
Views: 58899
Reputation: 716
When i configured my maven-surefire-plugin i had two lined with the tag <argLine>...</argLine>
and that is what prevented JMockit from initializing.
When you debug maven, try to run your lifecycle target with a -e
flag so you'll know if the JVM values were set correctly.
Upvotes: 0
Reputation: 1881
For VSCode JMockito error -
You'll have to make a settings.json file with java.test.config in it.
In that file add :
"java.test.config": [
{
"name": "myConfiguration",
"workingDirectory": "${workspaceFolder}",
"vmargs": [
"-Xmx512M", //this was here by default
"-javaagent:/path/to/jmockito/"
]
]
Upvotes: 0
Reputation: 1701
I had no difficulties running my tests in Maven but I got the same error when I was running them in eclipse.
The JMockit Eclipse plugin allowed me to run all the test in eclipse without any extra configuration.
https://marketplace.eclipse.org/content/jmockit-eclipse
One of the featues of this plugin is
Automatically adds JMockit jar as -javaagent argument to JUnit launches.
Upvotes: 0
Reputation: 12692
As I understand it, this exception is thrown when one attempts to call a JMockit method, while JMockit has not been properly initialized.
Make sure you follow the JMockit installation instructions, especially points 3 and 4. If the JMockit jar comes after the JUnit jar in the classpath, it might cause problems.
Upvotes: 21
Reputation: 4101
I setup a properties file in the classpath for easy configuration of Junit 5:
It MUST be named junit-platform.properties
junit.jupiter.extensions.autodetection.enabled = true
junit.jupiter.testinstance.lifecycle.default = per_class
Make sure you're using a newer version of Jmockit that has the JmockitExtension class. NOTE: Jmockit version 1.8 IS NOT newer than version 1.41. The 1.8 version should have been 1.08.
Maven Central reference: https://mvnrepository.com/artifact/org.jmockit/jmockit
Upvotes: 1
Reputation: 1359
It still doesnt run for me in IntelliJ. I am able to run it command line though.
Upvotes: 0
Reputation: 541
I simply added:
@RunWith(JMockit.class)
Which resolved the issue, as per the documentation in the accepted answer.
Upvotes: 0
Reputation: 4599
In addition to Gary Rowe's solution:
A more robust (i.e. version and repository path agnostic) integration of JMockit into Surefire would be
<argLine>-javaagent:${org.jmockit:jmockit:jar}
To make this resolution work, the maven-dependency-plugin (version >= 2.5.1!) needs to be configured like this:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>getClasspathFilenames</id>
<goals>
<goal>properties</goal>
</goals>
</execution>
</executions>
Upvotes: 4
Reputation: 7257
The accepted answer has fallen a little out of date regarding the links so it's worth mentioning the various solutions directly.
To fix this problem do one of the following:
1 - Specifiy a javaagent
Add this to your JUnit execution environment (for your version):
-javaagent:path/to/your/jmockit/jmockit-0.998.jar
2 - configure the Surefire plugin in Maven to avoid it
Add the following to your Maven configuration (choose your own versions)
<!-- 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>
Ensure that your Surefire plugin is configured as follows (for your particular versions):
<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 - Use the JUnit @RunWith annotation
Add this JUnit runner annotation on each and every test class
@RunWith(JMockit.class)
public class ExampleTest {}
Upvotes: 46