web-dev-qa-db-ja.com

Mockito 2 for Android Instrumentation test:プラグインを初期化できませんでした:インターフェースorg.mockito.plugins.MockMaker

ユニットテストにMockito 2とEspressoを使用していますが、インストゥルメンテーションテストでMockito 2を使用しようとして問題が発生しました。テストの実行中に、このエラーが発生します

Java.lang.IllegalStateException: Could not initialize plugin: interface org.mockito.plugins.MockMaker (alternate: null)
at org.mockito.internal.configuration.plugins.PluginLoader$1.invoke(PluginLoader.Java:74)
at Java.lang.reflect.Proxy.invoke(Proxy.Java:913)
at $Proxy5.isTypeMockable(Unknown Source)
at org.mockito.internal.util.MockUtil.typeMockabilityOf(MockUtil.Java:29)
at org.mockito.internal.util.MockCreationValidator.validateType(MockCreationValidator.Java:22)
at org.mockito.internal.creation.MockSettingsImpl.validatedSettings(MockSettingsImpl.Java:232)
at org.mockito.internal.creation.MockSettingsImpl.build(MockSettingsImpl.Java:226)
at org.mockito.internal.MockitoCore.mock(MockitoCore.Java:64)
at org.mockito.Mockito.mock(Mockito.Java:1864)
at org.mockito.Mockito.mock(Mockito.Java:1777)
at com.armop.insight.views.activity.InsightActivityTest.testUserResultReturnsEmpty(InsightActivityTest.kt:66)
at Java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:17)
at Android.support.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.Java:80)
at Android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.Java:433)
at org.junit.rules.RunRules.evaluate(RunRules.Java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.Java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:363)
at org.junit.runners.Suite.runChild(Suite.Java:128)
at org.junit.runners.Suite.runChild(Suite.Java:27)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:363)
at org.junit.runner.JUnitCore.run(JUnitCore.Java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.Java:115)
at Android.support.test.internal.runner.TestExecutor.execute(TestExecutor.Java:58)
at Android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.Java:369)
at Android.app.Instrumentation$InstrumentationThread.run(Instrumentation.Java:2075)
Caused by: Java.lang.IllegalStateException: Failed to load interface org.mockito.plugins.MockMaker implementation declared in Sun.misc.CompoundEnumeration@5ea25e5
at org.mockito.internal.configuration.plugins.PluginInitializer.loadImpl(PluginInitializer.Java:54)
at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.Java:57)
at org.mockito.internal.configuration.plugins.PluginLoader.loadPlugin(PluginLoader.Java:44)
at org.mockito.internal.configuration.plugins.PluginRegistry.<init>(PluginRegistry.Java:21)
at org.mockito.internal.configuration.plugins.Plugins.<clinit>(Plugins.Java:18)
at org.mockito.internal.configuration.plugins.Plugins.getMockMaker(Plugins.Java:34)
at org.mockito.internal.util.MockUtil.<clinit>(MockUtil.Java:24)
... 38 more
Caused by: org.mockito.exceptions.base.MockitoInitializationException:
Could not initialize inline Byte Buddy mock maker. (This mock maker is not supported on Android.)


IMPORTANT INFORMATION FOR Android USERS:

The regular Byte Buddy mock makers cannot generate code on an Android VM!
To resolve this, please use the 'mockito-Android' dependency for your application:
http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22mockito-Android%22%20g%3A%22org.mockito%22

Java               : 0.9
JVM vendor name    : The Android Project
JVM vendor version : 2.1.0
JVM name           : Dalvik
JVM version        : 0.9
JVM info           : null
OS name            : Linux
OS version         : 3.18.91+

at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.<init>(InlineByteBuddyMockMaker.Java:171)
at Java.lang.Class.newInstance(Native Method)
at org.mockito.internal.configuration.plugins.PluginInitializer.loadImpl(PluginInitializer.Java:49)
... 44 more
Caused by: Java.lang.NoClassDefFoundError: Failed resolution of: Ljava/lang/management/ManagementFactory;
at net.bytebuddy.agent.ByteBuddyAgent$ProcessProvider$ForCurrentVm$ForLegacyVm.resolve(ByteBuddyAgent.Java:940)
at net.bytebuddy.agent.ByteBuddyAgent$ProcessProvider$ForCurrentVm.resolve(ByteBuddyAgent.Java:925)
at net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.Java:352)
at net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.Java:320)
at net.bytebuddy.agent.ByteBuddyAgent.install(ByteBuddyAgent.Java:306)
at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.<clinit>(InlineByteBuddyMockMaker.Java:101)
... 46 more
Caused by: Java.lang.ClassNotFoundException: Didn't find class "Java.lang.management.ManagementFactory" on path: DexPathList[[Zip file "/system/framework/Android.test.runner.jar", Zip file "/system/framework/Android.test.mock.jar", Zip file "/data/app/com.armop.debug.test-GWx-9OMGi9FTj01c1acroQ==/base.apk", Zip file "/data/app/com.armop.debug-28ywc-fJ-zzWAgMPBESlGQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.armop.debug.test-GWx-9OMGi9FTj01c1acroQ==/lib/x86, /data/app/com.armop.debug-28ywc-fJ-zzWAgMPBESlGQ==/lib/x86, /data/app/com.armop.debug.test-GWx-9OMGi9FTj01c1acroQ==/base.apk!/lib/x86, /data/app/com.armop.debug-28ywc-fJ-zzWAgMPBESlGQ==/base.apk!/lib/x86, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:125)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:379)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:312)
... 52 more

そして、これがテストコードです。

 @Test
fun testUserResultReturnsEmpty() {

    val userMock = Mockito.mock(UserModel::class.Java)
    Mockito.`when`(ArmOpApplication.getUserFromPrefs()).thenReturn(userMock)

    mActivityRule.launchActivity(Intent())
    mCountDownLatch.await(3000, TimeUnit.MILLISECONDS)

    assertNotNull(mActivityRule.activity.mInsightCategories)

    assertNull(mActivityRule.activity.mData)
    assertNull(mActivityRule.activity.insightsRecyclerView.adapter)
}

詳細についてググったところ、mockitoコアの代わりにmockito-Androidを使用する必要があることがわかり、アプリケーションのbuild.gradleファイルにこれらの行を追加しました

androidTestImplementation "org.mockito:mockito-Android:${libMockitoAndroidVersion}"
androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:2.2.0'

where libMockitoAndroidVersion = 2.16.0

また、org.mockito.plugins.MockMakerファイルをandroidTestリソースディレクトリに追加して、Kotlinのクラスを操作します。

enter image description here

この問題を修正する方法はありますか?どんな助けでもありがたいです。

9
Arshak92

スタックトレースから、Androidでは動作しないインラインByte Buddyモックメーカーを使用しているようです。使用可能な両方のプラグインが最初にクラスパスに追加されたプラグインをロードするため、何らかの形で推移的に含まれていないことを確認してください。

0

Android replace

androidTestImplementation "org.mockito:mockito-core:$mockito_core_version"
androidTestImplementation "org.mockito:mockito-inline:$mockito_core_version"

for

androidTestImplementation "org.mockito:mockito-Android:$mockito_core_version"

私のバージョンは:$mockito_core_version = '2.28.2'

3

これは私を助けました

androidTestImplementation("org.koin:koin-test:1.0.2")
{ exclude("org.mockito", "mockito-inline") }
androidTestImplementation("org.mockito:mockito-Android:2.24.5")

Koinはorg.mockitoを含むいくつかのライブラリを表します

2
Nokuap

同様の問題があります。私のケースは、resource/mockito-extensions/org.mockito.plugins.MockMakerファイルでの宣言が無効でした。いくつかのリファクタリングプロセス中にIDEが正しい値を置き換えました:

mock-maker-inline

これで:

infrastructure-maker-inline 

最初のルックで疑わしく見えなかったので、commit diffをレビューしているときに偶然の変更に気づきました。

2
Greg Barski