Java.lang.NoClassDefFoundError: org / objenesis / ObjenesisStd with Mockito

I do not know why I have this error with mockito

java.lang.NoClassDefFoundError: org/objenesis/ObjenesisStd at org.mockito.internal.creation.jmock.ClassImposterizer.<init>(ClassImposterizer.java:36) at org.mockito.internal.creation.jmock.ClassImposterizer.<clinit>(ClassImposterizer.java:29) at org.mockito.internal.util.MockCreationValidator.isTypeMockable(MockCreationValidator.java:17) at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.java:21) at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.java:133) at org.mockito.internal.creation.MockSettingsImpl.confirm(MockSettingsImpl.java:127) at org.mockito.internal.MockitoCore.mock(MockitoCore.java:50) at org.mockito.Mockito.mock(Mockito.java:1243) at org.mockito.Mockito.mock(Mockito.java:1120) at fr.oap.SubscriptionTest.testGetSubscriptionById(SubscriptionFactoryTest.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at junit.framework.TestCase.runTest(TestCase.java:176) at junit.framework.TestCase.runBare(TestCase.java:141) at junit.framework.TestResult$1.protect(TestResult.java:122) at junit.framework.TestResult.runProtected(TestResult.java:142) at junit.framework.TestResult.run(TestResult.java:125) at junit.framework.TestCase.run(TestCase.java:129) at junit.framework.TestSuite.runTest(TestSuite.java:255) at junit.framework.TestSuite.run(TestSuite.java:250) at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 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.ClassNotFoundException: org.objenesis.ObjenesisStd at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 29 more 

About my test class:

 import junit.framework.TestCase; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import fr.aop.subscription.AbstractSubscription; public class SubscriptionTest extends TestCase { @Test public void testGetSubscriptionById() { ArgumentCaptor<AbstractSubscription> arg=ArgumentCaptor.forClass(AbstractSubscription.class); Subscription objMock=Mockito.mock(Subscription.class); Mockito.when(objMock.getSubscribById(1)).thenReturn(arg.getValue()); } } 

And about the getSubscribById whitch method is in the Subscription class:

 @Override public AbstractSubscription getSubscriptionById(final Integer id) { this.log.debug("BEGIN: getSubscriptionById id = " + id); AbstractSubscription obj = null; if (id != null) { final StringBuilder queryString = new StringBuilder("select c from AbstractSubscription c "); try { queryString.append("where c.id = :id"); Query query = this.getEntityManager().createQuery(queryString.toString()); query = query.setParameter("id", id); obj = (AbstractSubscription) query.getSingleResult(); } catch (final Exception exc) { } } return obj; } 

when I initialize the Subcription class, it requires me to connect to the database, so I want to avoid this and look for a solution like mockito

+8
unit-testing junit testing mockito mocking
source share
2 answers

ClassNotFoundException is the result of a class loader that cannot load a specific class.

In your case, Mockito is transitively dependent on Objenesis (Objenesis is required for proper behavior). Most likely you are trying to run your test using Mockito in the test class path, but without Objenesis.

You need to add Objenesis to your test class path.

For maven projects, make sure:

  • you declared mockito as a test addiction

     <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.10.19</version> <scope>test</scope> </dependency> 
  • run a specific test from the command line

     mvn test -Dtest=fullyQualifedNameToYourTestClass 
+13
source share

You can try adding the mockito-all artifact instead of mockito-core, it works from version 1.9.5

+2
source share

All Articles