web-dev-qa-db-fra.com

java.lang.NoClassDefFoundError: org/objenesis/ObjenesisStd avec Mockito

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

10
TinyOS

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:

  1. 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>
    
  2. pour exécuter un test particulier à partir de la ligne de commande, exécutez

    mvn test -Dtest=fullyQualifedNameToYourTestClass
    
12
Crazyjavahacking

Vous pouvez essayer d'ajouter l'artefact mockito-all à la place de mockito-core, cela fonctionne depuis la version 1.9.5

4
user917279

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>
2
Popeye

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

0
user1853984

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.

0
Eagle