Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android instrumentation test packaging fails for mockito-android 3.5.0 with minSdk < 26 #2007

Closed
DeuceTheCoder opened this issue Aug 18, 2020 · 54 comments

Comments

@DeuceTheCoder
Copy link

@DeuceTheCoder DeuceTheCoder commented Aug 18, 2020

We've upgraded from mockito-android:3.4.6 to mockito-android:3.5.0. I'm attempting to package up my instrumented tests by running the assembleAndroidTest gradle task. The task fails with the following errors:

/Users/<me>/.gradle/caches/transforms-2/files-2.1/fb7959dc5bfc8ebb26ad0660efa1929e/jetified-mockito-core-3.5.0.jar: D8: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)
/Users/<me>/.gradle/caches/transforms-2/files-2.1/4d4498fa5552ba637b5a9594a0871b80/jetified-objenesis-3.1.jar: D8: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)
/Users/<me>/.gradle/caches/transforms-2/files-2.1/4d4498fa5552ba637b5a9594a0871b80/jetified-objenesis-3.1.jar: D8: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)

and with root cause:

com.android.tools.r8.utils.b: Error: /Users/<me>/.gradle/caches/transforms-2/files-2.1/4d4498fa5552ba637b5a9594a0871b80/jetified-objenesis-3.1.jar:org/objenesis/instantiator/util/DefineClassHelper$Java8.class, java.lang.Class org.objenesis.instantiator.util.DefineClassHelper$Java8.defineClass(java.lang.String, byte[], int, int, java.lang.Class, java.lang.ClassLoader, java.security.ProtectionDomain), MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)
        at com.android.tools.r8.utils.y0.a(:21)
        at com.android.tools.r8.utils.O.a(:51)
        ... 35 more
@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Aug 18, 2020

Should be fixed with #2006

@kozaxinan
Copy link
Contributor

@kozaxinan kozaxinan commented Aug 19, 2020

We still have issues with 3.5.2. We are unable to update to new version and use assembleAndroidTest task.

/usr/local/gradle/caches/transforms-2/files-2.1/225c46d0e9f10ff5ef3f4d9a009c4924/jetified-objenesis-3.1.jar: D8: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)

com.android.tools.r8.errors.a: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)

@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Aug 19, 2020

@kozaxinan Are you certain that you are using 3.5.2 and aren't accidentally using an older version of either Mockito or ByteBuddy? We have had confirmations from other users that 3.5.2 fixed the issue you are seeing, so it would be good to double check that you have the correct version.

@francescocervone
Copy link

@francescocervone francescocervone commented Aug 19, 2020

@TimvdLippe I confirm the issue still occurs also in our project with the exact same error.

  • mockito-core 3.5.2
  • mockito-android 3.5.2
  • mockito-inline 3.5.2
  • objenesis 3.1
  • bytebuddy 1.10.13
@francescocervone
Copy link

@francescocervone francescocervone commented Aug 19, 2020

Looks like the issue was introduced in objenesis 3.x (upgraded in #1998)
Forcing objenesis to 2.6 makes assembleAndroidTest task succeed.

@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Aug 19, 2020

Aha, thanks for letting us know. I will create a revert.

@alejandrorosas
Copy link

@alejandrorosas alejandrorosas commented Aug 26, 2020

Still getting this error with 3.5.7

@azizbekian
Copy link

@azizbekian azizbekian commented Aug 27, 2020

Here's the stacktrace that I get when using 3.5.7:

/Users/azizbekian/.gradle/caches/transforms-2/files-2.1/63e24576c0e1d1e5b675c1c61e4e5727/jetified-objenesis-3.1.jar: D8: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)
Stack trace:
com.android.tools.r8.errors.a: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)
        at com.android.tools.r8.errors.a.a(:7)
        at com.android.tools.r8.ir.conversion.O.b(:58)
        at com.android.tools.r8.ir.conversion.O.a(:104)
        at com.android.tools.r8.ir.conversion.O.a(:53)
        at com.android.tools.r8.graph.C.b(:43)
        at com.android.tools.r8.ir.conversion.O.b(:35)
        at com.android.tools.r8.utils.U0.a(:10)
        at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125)
        at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:69)
        at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78)
        at com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:322)
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
        at com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:66)
        at com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:36)
        at com.android.tools.r8.utils.U0.a(:3)
        at com.android.tools.r8.ir.conversion.O.a(:10)
        at com.android.tools.r8.D8.d(:29)
        at com.android.tools.r8.D8.b(:1)
        at com.android.tools.r8.utils.W.a(:30)
        at com.android.tools.r8.D8.run(:11)
        at com.android.builder.dexing.D8DexArchiveBuilder.convert(D8DexArchiveBuilder.java:116)
        at com.android.build.gradle.internal.dependency.BaseDexingTransform.process(DexingTransform.kt:296)
        at com.android.build.gradle.internal.dependency.BaseDexingTransform.processNonIncrementally(DexingTransform.kt:243)
        at com.android.build.gradle.internal.dependency.BaseDexingTransform.doTransform(DexingTransform.kt:153)
        at com.android.build.gradle.internal.dependency.BaseDexingTransform.access$doTransform(DexingTransform.kt:69)
        at com.android.build.gradle.internal.dependency.BaseDexingTransform$transform$1.invoke(DexingTransform.kt:104)
        at com.android.build.gradle.internal.dependency.BaseDexingTransform$transform$1.invoke(DexingTransform.kt:69)
        at com.android.build.gradle.internal.tasks.BlocksUtilsKt.recordArtifactTransformSpan(BlocksUtils.kt:33)
        at com.android.build.gradle.internal.dependency.BaseDexingTransform.transform(DexingTransform.kt:100)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformer.transform(DefaultTransformer.java:193)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformerInvocationFactory$TransformerExecution.execute(DefaultTransformerInvocationFactory.java:332)
        at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$0(ExecuteStep.java:32)
        at java.util.Optional.map(Optional.java:215)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:32)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:67)
        at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:36)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
        at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:34)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54)
        at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
        at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:159)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:72)
        at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:43)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:92)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85)
        at java.util.Optional.map(Optional.java:215)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:94)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78)
        at java.util.Optional.orElseGet(Optional.java:267)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28)
        at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformerInvocationFactory$2.lambda$call$2(DefaultTransformerInvocationFactory.java:200)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformerInvocationFactory.fireTransformListeners(DefaultTransformerInvocationFactory.java:269)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformerInvocationFactory.access$300(DefaultTransformerInvocationFactory.java:79)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformerInvocationFactory$2.call(DefaultTransformerInvocationFactory.java:178)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformerInvocationFactory$2.call(DefaultTransformerInvocationFactory.java:175)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:409)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:399)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:94)
        at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformerInvocationFactory.lambda$doTransform$0(DefaultTransformerInvocationFactory.java:175)
        at org.gradle.api.internal.artifacts.transform.ImmutableTransformationWorkspaceProvider.lambda$withWorkspace$0(ImmutableTransformationWorkspaceProvider.java:81)
        at org.gradle.cache.internal.LockOnDemandCrossProcessCacheAccess.withFileLock(LockOnDemandCrossProcessCacheAccess.java:90)
        at org.gradle.cache.internal.DefaultCacheAccess.withFileLock(DefaultCacheAccess.java:191)
        at org.gradle.cache.internal.DefaultPersistentDirectoryStore.withFileLock(DefaultPersistentDirectoryStore.java:177)
        at org.gradle.cache.internal.DefaultCacheFactory$ReferenceTrackingCache.withFileLock(DefaultCacheFactory.java:201)
        at org.gradle.api.internal.artifacts.transform.ImmutableTransformationWorkspaceProvider.withWorkspace(ImmutableTransformationWorkspaceProvider.java:76)
        at org.gradle.api.internal.artifacts.transform.AbstractCachingTransformationWorkspaceProvider.lambda$withWorkspace$0(AbstractCachingTransformationWorkspaceProvider.java:55)
        at com.google.common.cache.LocalCache$LocalManualCache$1.load(LocalCache.java:4718)
        at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3445)
        at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2194)
        at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2153)
        at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2043)
        at com.google.common.cache.LocalCache.get(LocalCache.java:3851)
        at com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.java:4713)
        at org.gradle.api.internal.artifacts.transform.AbstractCachingTransformationWorkspaceProvider.withWorkspace(AbstractCachingTransformationWorkspaceProvider.java:55)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformerInvocationFactory.doTransform(DefaultTransformerInvocationFactory.java:175)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformerInvocationFactory.access$000(DefaultTransformerInvocationFactory.java:79)
        at org.gradle.api.internal.artifacts.transform.DefaultTransformerInvocationFactory$1.invoke(DefaultTransformerInvocationFactory.java:141)
        at org.gradle.api.internal.artifacts.transform.CacheableInvocation$1.invoke(CacheableInvocation.java:58)
        at org.gradle.api.internal.artifacts.transform.TransformationOperation.run(TransformationOperation.java:39)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:395)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:387)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:157)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:242)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:150)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.access$1500(DefaultBuildOperationExecutor.java:49)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor$ParentPreservingQueueWorker.execute(DefaultBuildOperationExecutor.java:437)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.runOperation(DefaultBuildOperationQueue.java:231)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.access$600(DefaultBuildOperationQueue.java:173)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable$1.create(DefaultBuildOperationQueue.java:210)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable$1.create(DefaultBuildOperationQueue.java:204)
        at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:180)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.runBatch(DefaultBuildOperationQueue.java:204)
        at org.gradle.internal.operations.DefaultBuildOperationQueue$WorkerRunnable.run(DefaultBuildOperationQueue.java:178)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
        at java.lang.Thread.run(Thread.java:748)
        Suppressed: java.util.concurrent.ExecutionException: com.android.tools.r8.errors.a: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)
                at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:552)
                at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:513)
                at com.google.common.util.concurrent.FluentFuture$TrustedFuture.get(FluentFuture.java:86)
                at com.android.tools.r8.utils.U0.a(:14)
                at com.android.tools.r8.utils.U0.a(:9)
                ... 114 more
        [CIRCULAR REFERENCE:com.android.tools.r8.errors.a: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)]
Caused by: com.android.tools.r8.a: MethodHandle.invoke and MethodHandle.invokeExact are only supported starting with Android O (--min-api 26)
        at com.android.tools.r8.ir.conversion.N.a(:633)
        at com.android.tools.r8.ir.conversion.N.a(:674)
        at com.android.tools.r8.r.n.A.a(:236)
        at com.android.tools.r8.ir.conversion.o.a(:153)
        at com.android.tools.r8.ir.conversion.N.a(:133)
        at com.android.tools.r8.graph.l.a(:93)
        at com.android.tools.r8.graph.l.a(:71)
        at com.android.tools.r8.graph.l.buildIR(:1)
        at com.android.tools.r8.graph.C0.buildIR(:1)
        at com.android.tools.r8.graph.T.a(:152)
        at com.android.tools.r8.ir.conversion.O.a(:412)
        at com.android.tools.r8.ir.conversion.O.b(:53)
        ... 127 more


TimvdLippe added a commit that referenced this issue Sep 1, 2020
[ci maven-central-release]

Co-authored-by: Tim van der Lippe <TimvdLippe@users.noreply.github.com>
@tobiasKaminsky
Copy link

@tobiasKaminsky tobiasKaminsky commented Sep 2, 2020

I updated all mockito packages to 3.5.9 but unfortunately I do get still the same error as above.

@tobiasKaminsky
Copy link

@tobiasKaminsky tobiasKaminsky commented Sep 4, 2020

This still seems to fail for me:

Execution failed for task ':mergeDexGplayDebugAndroidTest'.
> Could not resolve all files for configuration ':gplayDebugAndroidTestRuntimeClasspath'.
   > Failed to transform objenesis-3.1.jar (org.objenesis:objenesis:3.1) to match attributes {artifactType=android-dex, dexing-enable-desugaring=true, dexing-incremental-desugaring-v2=false, dexing-is-debuggable=true, dexing-min-sdk=18, org.gradle.category=library, org.gradle.libraryelements=jar, org.gradle.status=release, org.gradle.usage=java-runtime}.
      > Execution failed for DexingWithClasspathTransform: /home/tobi/.gradle/caches/transforms-2/files-2.1/66df4f0b18795a51947f8881933478f9/jetified-objenesis-3.1.jar.
         > Error while dexing.

I removed
androidTestImplementation "org.mockito:mockito-core:$mockitoVersion"
and changed:

testImplementation ("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0") {
        exclude group: "org.mockito", module: "mockito-core"
    }

If you want to test it: nextcloud/android#6768

@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Sep 7, 2020

@gnarea You are depending on Objenesis 3, which is incompatible with Android <26. Please downgrade to Objenesis 2 and depend on mockito-android. For more info, see the context in #2024

@francescocervone
Copy link

@francescocervone francescocervone commented Sep 7, 2020

@TimvdLippe looks like mockito-core still has objenesis 3.1 as a dependency.

+--- project :my-project
|    \--- org.mockito:mockito-core:3.5.10
|         +--- net.bytebuddy:byte-buddy:1.10.13
|         +--- net.bytebuddy:byte-buddy-agent:1.10.13
|         \--- org.objenesis:objenesis:3.1

+--- org.mockito:mockito-android:3.5.10
|    +--- org.mockito:mockito-core:3.5.10 (*)
|    +--- net.bytebuddy:byte-buddy-android:1.10.13
|    |    +--- net.bytebuddy:byte-buddy:1.10.13
|    |    \--- com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3
|    \--- org.objenesis:objenesis:[2.6, 3.0) -> 3.1
@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Sep 7, 2020

@francescocervone That is correct. For non-Android projects, they can use Objenesis 3 just fine.

@francescocervone
Copy link

@francescocervone francescocervone commented Sep 7, 2020

@TimvdLippe it's pretty common for Android projects having some pure JVM Gradle modules, not depending on Android. In that case we must depend on mockito-core which depends on Objenesis 3. What do you suggest in that case?

Anyway, even if we don't depend directly on mockito-core, we get the same error on mockito-core (I suppose that's because mockito-android depends on mockito-core).

> Transform artifact mockito-core-3.5.10.jar (org.mockito:mockito-core:3.5.10) with DexingNoClasspathTransform
D8: Private interface methods are only supported starting with Android N (--min-api 24): java.lang.Object org.mockito.plugins.MemberAccessor.lambda$newInstance$0(java.lang.reflect.Constructor, java.lang.Object[])
Stack trace:
com.android.tools.r8.a: Private interface methods are only supported starting with Android N (--min-api 24): java.lang.Object org.mockito.plugins.MemberAccessor.lambda$newInstance$0(java.lang.reflect.Constructor, java.lang.Object[])

[ stacktrace ]

* What went wrong:
Execution failed for task ':app:mergeExtDexDebugAndroidTest'.
> Could not resolve all files for configuration ':app:debugAndroidTestRuntimeClasspath'.
   > Failed to transform mockito-core-3.5.10.jar (org.mockito:mockito-core:3.5.10) to match attributes {artifactType=android-dex, dexing-enable-desugaring=false, dexing-incremental-desugaring-v2=false, dexing-is-debuggable=true, dexing-min-sdk=21, org.gradle.category=library, org.gradle.libraryelements=jar, org.gradle.status=release, org.gradle.usage=java-runtime}.
      > Execution failed for DexingNoClasspathTransform: /Users/me/.gradle/caches/transforms-2/files-2.1/9ebcc121d44dc6f808610b5ee83414a2/jetified-mockito-core-3.5.10.jar.
         > Error while dexing.

Do you need an example project?

@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Sep 7, 2020

@francescocervone That last stacktrace is yet another issue that is new to me, as it complains about private interface methods. That seems to be unrelated to Objenesis. The code in question is

default Object newInstance(
Constructor<?> constructor, OnConstruction onConstruction, Object... arguments)
throws InstantiationException, InvocationTargetException, IllegalAccessException {
return onConstruction.invoke(() -> newInstance(constructor, arguments));
}

I guess older versions of Android do not support default interface methods. I am not sure what to do here, as that seems to be a problem where Android did not support all features of Java 8. Since Mockito 3 targets Java 8, that would be incompatible with older versions of Android.

Can you use Mockito 2 solely for tests running on older versions of Android?

@francescocervone
Copy link

@francescocervone francescocervone commented Sep 7, 2020

Can you use Mockito 2 solely for tests running on older versions of Android?

No, because this is a compilation error which depends on the minimum supported Android version. Almost every Android project should use Mockito 2 until android 26 will be the "generally accepted" minimum sdk supported version (probably in at least 5 years 😄).

@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Sep 25, 2020

For anyone who is looking to contribute, please check out the upstream issue at easymock/objenesis#79

@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Jan 17, 2021

I am going to close this issue in favor of easymock/objenesis#79

@henri-tremblay
Copy link

@henri-tremblay henri-tremblay commented Mar 7, 2021

I have pushed the changes moving some instantiators in a new project. Could you please check if it works?

@henri-tremblay
Copy link

@henri-tremblay henri-tremblay commented Mar 22, 2021

Release 3.2 was done. It should work now.

@darakeon

This comment has been hidden.

@PaulKlauser
Copy link
Contributor

@PaulKlauser PaulKlauser commented Mar 30, 2021

Release 3.2 of Objenesis was done, Mockito still needs to have its dependency updated to 3.2.

This can be worked around by declaring the Objenesis dependency yourself like implementation 'org.objenesis:objenesis:3.2 and rely on gradle's dependency resolution to go with the 3.2 version instead of the 3.1 currently included with Mockito

@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Mar 31, 2021

@PaulKlauser Do you mind sending us a PR which updates the version?

@TimvdLippe TimvdLippe reopened this Mar 31, 2021
@PaulKlauser
Copy link
Contributor

@PaulKlauser PaulKlauser commented Mar 31, 2021

PaulKlauser added a commit to PaulKlauser/mockito that referenced this issue Mar 31, 2021
PaulKlauser added a commit to PaulKlauser/mockito that referenced this issue Mar 31, 2021
@nokite
Copy link

@nokite nokite commented Apr 7, 2021

Could you consider publishing this to Maven as well?

@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Apr 7, 2021

Mockito 3.9.0 should be published to Maven Central: https://github.com/mockito/mockito/runs/2288011033?check_suite_focus=true

@nokite
Copy link

@nokite nokite commented Apr 7, 2021

Thanks! It's still at 3.8.0 on mvnrepository and maven but I suppose it can take several hours for the change to propagate.

@TimvdLippe
Copy link
Contributor

@TimvdLippe TimvdLippe commented Apr 7, 2021

Yes these systems take a while to obtain the new information. 3.9.0 is published here: https://repo1.maven.org/maven2/org/mockito/mockito-core/3.9.0/

@gmale
Copy link

@gmale gmale commented Apr 29, 2021

Just mentioning that I had this exact crash and upgrading to 3.9.0 from 3.8.0 fixed it.

However, it might be worth mentioning that any Android project that is just using JCenter as a repository will not return the right information for latest version. Android projects need to begin adding mavenCentral() as a repository, which previously was unnecessary because JCenter mirrored Maven Central. That's changing and it's because of this that my particular project didn't recognize the 3.9.0 update.

repositories {
    google()
    mavenCentral()  <-- many projects need to add this, explicitly
    jcenter()
    maven { url 'https://jitpack.io' }
}
gmale added a commit to zcash/zcash-android-wallet-sdk that referenced this issue Apr 29, 2021
This required an update in mockito which was indirectly impacted by not having mavenCentral() as a repository as mentioned here mockito/mockito#2007 (comment)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet