java.lang.NoClassDefFoundError: org/objenesis/ObjenesisStd mit Mockito
Ich weiß nicht warum, ich habe diesen Fehler mit 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
Über meine Klasse, der Test ist wie folgt :
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());
}
}
Und über die Methode getSubscribById whitch ist, die in der Klasse Abonnement:
@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;
}
wenn ich instantiieren der Subcription-Klasse, die es verlangen, mir die Verbindung zu der Datenbank, das ist, warum ich will, um dem zu entgehen und auf der Suche nach einer Lösung, wie mockito
- fügen Sie einfach objenesis in den classpath
Du musst angemeldet sein, um einen Kommentar abzugeben.
ClassNotFoundException
ist Ergebnis einer class-loader, der nicht in der Lage, laden einer bestimmten Klasse.In Ihrem Fall Mockito hat eine transitive Abhängigkeit zu Objenesis (es muss Objenesis zum richtigen Verhalten). Sie sind wahrscheinlich versuchen, führen Sie Ihre Tests mit Mockito auf die test-Klasse Weg, aber ohne Objenesis.
Müssen Sie Objenesis, um Ihre test-Klasse Weg.
Für maven-Projekte, sicher sein, dass:
haben Sie erklärt, Mockito test-Abhängigkeit
einen test von der Befehlszeile aus ausführen
Können Sie versuchen die mockito-all Artefakt anstelle von mockito-core, es funktioniert seit der version 1.9.5
War ich immer die gleichen Fehler von:
als ich mit einem test in einem neuen Projekt, mit Mockito.
Stellt sich heraus, zusätzlich zu den Mockito Abhängigkeiten, die ich auch hatte, um die Objenesis Abhängigkeit. Alles, was ich zu tun war, fügen Sie die unten Abhängigkeit zu meinem pom.xml und es hat alles völlig in Ordnung.
Ich hatte ein ähnliches problem in einem Android-Projekt mit gradle.
Wie @Popeye hat für maven, habe ich noch die folgende Zeile zu bauen.gradle, unter Abhängigkeiten:
Dass mein problem gelöst.
Habe ich dieses Problem mit der version von mockito-core-2.22.0.
Nach der Untersuchung scheint es, dass das Glas objenesis war beschädigt in meinem maven repository...
Nur ein
rm -rf .m2/repository/org/objenesis
ist genug