it-swarm.com.ru

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

Я не знаю, почему у меня такая ошибка с 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

Про мой класс Test это примерно так:

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());
}
}

А по поводу метода getSubscribeById который находится в классе 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;
}

когда я создаю экземпляр класса Subcription, он требует подключения к базе данных, поэтому я хочу избежать этого и искать решение, подобное mockito

10
TinyOS

ClassNotFoundException является результатом загрузчика классов, который не может загрузить определенный класс.

В вашем случае Mockito имеет переходную зависимость от Objenesis (для правильного поведения он нуждается в Objenesis). Скорее всего, вы пытаетесь выполнить свой тест с Mockito на пути к классам тестов, но без Objenesis.

Вам нужно добавить Objenesis в ваш путь к тестовому классу.

Для Maven проектов, убедитесь, что:

  1. вы объявили Mockito тестовой зависимостью

    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>1.10.19</version>
        <scope>test</scope>
    </dependency>
    
  2. запустить определенный тест из командной строки выполнить

    mvn test -Dtest=fullyQualifedNameToYourTestClass
    
12
Crazyjavahacking

Вы можете попробовать добавить артефакт mockito-all вместо mockito-core, он работает с версии 1.9.5

4
user917279

Я получаю ту же ошибку:

Java.lang.NoClassDefFoundError: org/objenesis/ObjenesisStd

когда я проводил тест в новом проекте, который использовал Mockito.

Оказывается, в дополнение к добавлению зависимостей Mockito мне также пришлось добавить зависимость Objenesis. Все, что мне нужно сделать, это добавить приведенную ниже зависимость в мой файл pom.xml, и все это прекрасно работает.

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

У меня есть эта проблема с версией mockito-core 2.22.0.

После расследования кажется, что в моем хранилище Maven была повреждена банка objenesis ...

Достаточно rm -rf .m2/repository/org/objenesis

0
user1853984

У меня была похожая проблема в проекте Android с использованием Gradle. 

Как и @Popeye для maven, я добавил следующую строку в build.gradle среди зависимостей: 

testImplementation 'org.objenesis:objenesis:2.3'

Это решило мою проблему.

0
Eagle