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のような解決策を探します
ClassNotFoundException
は、特定のクラスをロードできないクラスローダーの結果です。
あなたの場合、MockitoにはObjenesisへの推移的な依存関係があります(正しい動作にはObjenesisが必要です)。テストクラスパスでMockitoを使用してテストを実行しようとしている可能性がありますが、Objenesisはありません。
テストクラスパスにObjenesisを追加する必要があります。
Mavenプロジェクトの場合、次のことを確認してください。
mockitoをテスト依存関係として宣言しました
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
コマンドラインから特定のテストを実行するには
mvn test -Dtest=fullyQualifedNameToYourTestClass
Mockito-coreの代わりにmockito-allアーティファクトを追加してみてください。バージョン1.9.5以降で機能します
私は同じエラーを受け取りました:
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>
Android gradleを使用するプロジェクトで同様の問題がありました。
@Popeyeがmavenに対して行ったように、依存関係の中でbuild.gradleに次の行を追加しました。
testImplementation 'org.objenesis:objenesis:2.3'
それで問題は解決しました。
Mockito-core 2.22.0のバージョンでこの問題が発生します。
調査後、私のmavenリポジトリでobjenesisのjarファイルが破損しているようです...
ただrm -rf .m2/repository/org/objenesis
で十分です
同じ問題がありました。ローカルリポジトリからmockitoフォルダーを削除し、ビルドを再実行しました。