Je ne sais pas pourquoi j'ai cette erreur avec 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
À propos de ma classe de test est comme ceci:
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());
}
}
Et à propos de la méthode getSubscribById qui est dans la classe Subscription:
@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;
}
quand j'instancie la classe Subscription, elle me demande la connexion à la base de données, c'est pourquoi je veux y échapper et chercher une solution comme mockito
ClassNotFoundException
est le résultat d'un chargeur de classe qui ne peut pas charger une classe particulière.
Dans votre cas, Mockito a une dépendance transitive à Objenesis (Objenesis est nécessaire pour un comportement correct). Vous essayez probablement d'exécuter votre test avec Mockito sur le chemin du cours de test, mais sans Objenesis.
Vous devez ajouter Objenesis à votre chemin de classe de test.
Pour les projets Maven, assurez-vous que:
vous avez déclaré Mockito en tant que dépendance de test
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
pour exécuter un test particulier à partir de la ligne de commande, exécutez
mvn test -Dtest=fullyQualifedNameToYourTestClass
Vous pouvez essayer d'ajouter l'artefact mockito-all à la place de mockito-core, cela fonctionne depuis la version 1.9.5
J'avais la même erreur de:
Java.lang.NoClassDefFoundError: org/objenesis/ObjenesisStd
quand je faisais un test dans un nouveau projet qui utilisait Mockito.
En plus d'ajouter les dépendances Mockito, je devais également ajouter la dépendance Objenesis. Tout ce que je devais faire était d’ajouter la dépendance ci-dessous à mon fichier pom.xml et tout fonctionnait parfaitement.
<dependency>
<groupId>org.objenesis</groupId>
<artifactId>objenesis</artifactId>
<version>2.3</version>
<scope>test</scope>
</dependency>
J'ai ce problème avec la version de mockito-core 2.22.0.
Après enquête, il semble que le bocal d'objenesis ait été corrompu dans mon répertoire de maven ...
Juste un rm -rf .m2/repository/org/objenesis
suffit
J'ai eu un problème similaire dans un projet Android utilisant Gradle.
Comme @Popeye pour maven, j'ai ajouté la ligne suivante à build.gradle, parmi les dépendances:
testImplementation 'org.objenesis:objenesis:2.3'
Cela a résolu mon problème.