it-swarm.com.de

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

Ich weiß nicht, warum ich diesen Fehler mit Mockito habe 

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 von Test geht es so:

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, die in der Klasse Subscription enthalten ist:

@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 die Subcription-Klasse instanziiere, fordert sie mich zur Verbindung mit der Datenbank. Deswegen möchte ich das entziehen und nach einer Lösung wie mockito suchen

10
TinyOS

ClassNotFoundException ist das Ergebnis eines Klassenladers, der eine bestimmte Klasse nicht laden kann.

In Ihrem Fall hat Mockito eine transitive Abhängigkeit von Objenesis (er benötigt Objenesis für korrektes Verhalten). Sie versuchen höchstwahrscheinlich, Ihren Test mit Mockito auf dem Testklassenpfad auszuführen, jedoch ohne Objenesis.

Sie müssen Objenesis zu Ihrem Testklassenpfad hinzufügen.

Stellen Sie sicher, dass für Maven-Projekte Folgendes gilt:

  1. sie haben Mockito als Testabhängigkeit erklärt

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>1.10.19</version>
        <scope>test</scope>
    </dependency>
    
  2. um einen bestimmten Test von der Kommandozeile aus auszuführen

    mvn test -Dtest=fullyQualifedNameToYourTestClass
    
12

Sie können versuchen, das Mockito-All-Artefakt anstelle des Mockito-Core hinzuzufügen. Es funktioniert seit Version 1.9.5

4
user917279

Ich bekam den gleichen Fehler von:

Java.lang.NoClassDefFoundError: org/objenesis/ObjenesisStd

als ich einen Test in einem neuen Projekt durchführte, das Mockito verwendete.

Neben dem Hinzufügen der Mockito-Abhängigkeiten stellte sich heraus, dass ich auch die Objenesis-Abhängigkeit hinzufügen musste. Alles was ich tun musste, war, meine pom.xml mit der folgenden Abhängigkeit zu versehen, und alles funktionierte einwandfrei.

<dependency>
    <groupId>org.objenesis</groupId>
    <artifactId>objenesis</artifactId>
    <version>2.3</version>
    <scope>test</scope>
</dependency>
2
Popeye

Ich habe dieses Problem mit der Version von Mockito-Core 2.22.0.

Nach der Untersuchung scheint es, dass das Objeneseglas in meinem Repository für Maven beschädigt war ...

Ein rm -rf .m2/repository/org/objenesis reicht aus

0
user1853984

Ich hatte ein ähnliches Problem in einem Android-Projekt mit Gradle. 

Wie bei @Popeye für maven habe ich build.gradle unter den folgenden Abhängigkeiten die folgende Zeile hinzugefügt: 

testImplementation 'org.objenesis:objenesis:2.3'

Das hat mein Problem gelöst.

0
Eagle