web-dev-qa-db-ja.com

java.lang.NoClassDefFoundError:org / objenesis / ObjenesisStd with 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

テストの私のクラスについては次のとおりです:

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

また、メソッドgetSubscribByIdについて、クラスは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のような解決策を探します

13
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
    
13

Mockito-coreの代わりにmockito-allアーティファクトを追加してみてください。バージョン1.9.5以降で機能します

5
a_secenthusiast

私は同じエラーを受け取りました:

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

Android gradleを使用するプロジェクトで同様の問題がありました。

@Popeyeがmavenに対して行ったように、依存関係の中でbuild.gradleに次の行を追加しました。

testImplementation 'org.objenesis:objenesis:2.3'

それで問題は解決しました。

1
Eagle

Mockito-core 2.22.0のバージョンでこの問題が発生します。

調査後、私のmavenリポジトリでobjenesisのjarファイルが破損しているようです...

ただrm -rf .m2/repository/org/objenesisで十分です

0
user1853984

同じ問題がありました。ローカルリポジトリからmockitoフォルダーを削除し、ビルドを再実行しました。

0
AYADI Zied