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

Cannot Mock GcmNetworkManager on Android #1292

Closed
elyashivlavi opened this issue Jan 16, 2018 · 5 comments
Closed

Cannot Mock GcmNetworkManager on Android #1292

elyashivlavi opened this issue Jan 16, 2018 · 5 comments
Labels

Comments

@elyashivlavi
Copy link

elyashivlavi commented Jan 16, 2018

Hi,
I'm trying to mock GcmNetworkManager, using the simple following code:
Mockito.mock(GcmNetworkManager::class.java) (this is actually a kotlin code).
I'm using Mockito version 2.10.0.
Any idea how to solve it?

EDIT:
Note that the real exception is: Caused by: java.lang.IllegalStateException: final synchronized boolean com.google.android.gms.gcm.GcmNetworkManager.zzaa(java.lang.String,java.lang.String) is inconsistent for 'this' reference: 0

org.mockito.exceptions.base.MockitoException: 
Mockito cannot mock this class: class com.google.android.gms.gcm.GcmNetworkManager.

If you're not sure why you're getting this error, please report to the mailing list.


Java               : 1.8
JVM vendor name    : JetBrains s.r.o
JVM vendor version : 25.152-b08
JVM name           : OpenJDK 64-Bit Server VM
JVM version        : 1.8.0_152-release-915-b08
JVM info           : mixed mode
OS name            : Mac OS X
OS version         : 10.13.2


You are seeing this disclaimer because Mockito is configured to create inlined mocks.
You can learn about inline mocks and their limitations under item #39 of the Mockito class javadoc.

Underlying exception : org.mockito.exceptions.base.MockitoException: Could not modify all classes [class com.google.android.gms.gcm.GcmNetworkManager]

	at com.here.mobility.sdk.realityservices.PpoiFeatureSpec$testKodein$1.invoke(PpoiFeatureSpec.kt:58)
	at com.here.mobility.sdk.realityservices.PpoiFeatureSpec$testKodein$1.invoke(PpoiFeatureSpec.kt:20)
	at com.github.salomonbrys.kodein.Kodein$Builder.<init>(Kodein.kt:176)
	at com.github.salomonbrys.kodein.internal.KodeinImpl.<init>(KodeinImpl.kt:48)
	at com.github.salomonbrys.kodein.Kodein$Companion.invoke(Kodein.kt:422)
	at com.github.salomonbrys.kodein.Kodein$Companion.invoke$default(Kodein.kt:422)
	at com.here.mobility.sdk.realityservices.PpoiFeatureSpec.<init>(PpoiFeatureSpec.kt:49)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at java.lang.Class.newInstance(Class.java:442)
	at io.kotlintest.KTestJUnitRunner.<init>(KTestJUnitRunner.kt:9)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
	at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
	at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
	at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
	at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:49)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMainV2.main(AppMainV2.java:131)
Caused by: org.mockito.exceptions.base.MockitoException: Could not modify all classes [class com.google.android.gms.gcm.GcmNetworkManager]
	at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:138)
	at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:346)
	at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:161)
	at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:355)
	... 32 more
Caused by: java.lang.IllegalStateException: 
Byte Buddy could not instrument all classes within the mock's type hierarchy

This problem should never occur for javac-compiled classes. This problem has been observed for classes that are:
 - Compiled by older versions of scalac
 - Classes that are part of the Android distribution
	at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.triggerRetransformation(InlineBytecodeGenerator.java:120)
	at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.mockClass(InlineBytecodeGenerator.java:97)
	at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:37)
	at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator$1.call(TypeCachingBytecodeGenerator.java:34)
	at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:138)
	at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:346)
	at net.bytebuddy.TypeCache.findOrInsert(TypeCache.java:161)
	at net.bytebuddy.TypeCache$WithInlineExpunction.findOrInsert(TypeCache.java:355)
	at org.mockito.internal.creation.bytebuddy.TypeCachingBytecodeGenerator.mockClass(TypeCachingBytecodeGenerator.java:32)
	at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.createMockType(InlineByteBuddyMockMaker.java:200)
	at org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker.createMock(InlineByteBuddyMockMaker.java:181)
	at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:35)
	at org.mockito.internal.MockitoCore.mock(MockitoCore.java:51)
	at org.mockito.Mockito.mock(Mockito.java:1798)
	at org.mockito.Mockito.mock(Mockito.java:1711)
	... 32 more
Caused by: java.lang.IllegalStateException: final synchronized boolean com.google.android.gms.gcm.GcmNetworkManager.zzaa(java.lang.String,java.lang.String) is inconsistent for 'this' reference: 0
	at net.bytebuddy.asm.Advice$StackMapFrameHandler$Default.translateFrame(Advice.java:4003)
	at net.bytebuddy.asm.Advice$StackMapFrameHandler$Default.translateFrame(Advice.java:3950)
	at net.bytebuddy.asm.Advice$AdviceVisitor.visitFrame(Advice.java:7246)
	at net.bytebuddy.jar.asm.ClassReader.a(Unknown Source)
	at net.bytebuddy.jar.asm.ClassReader.b(Unknown Source)
	at net.bytebuddy.jar.asm.ClassReader.accept(Unknown Source)
	at net.bytebuddy.jar.asm.ClassReader.accept(Unknown Source)
	at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForInlining.create(TypeWriter.java:2941)
	at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:1633)
	at net.bytebuddy.dynamic.scaffold.inline.RedefinitionDynamicTypeBuilder.make(RedefinitionDynamicTypeBuilder.java:171)
	at net.bytebuddy.dynamic.scaffold.inline.AbstractInliningDynamicTypeBuilder.make(AbstractInliningDynamicTypeBuilder.java:92)
	at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:2639)
	at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.transform(InlineBytecodeGenerator.java:181)
	at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
	at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:428)
	at sun.instrument.InstrumentationImpl.retransformClasses0(Native Method)
	at sun.instrument.InstrumentationImpl.retransformClasses(InstrumentationImpl.java:144)
	at org.mockito.internal.creation.bytebuddy.InlineBytecodeGenerator.triggerRetransformation(InlineBytecodeGenerator.java:117)
	... 46 more


Process finished with exit code 255
@elyashivlavi
Copy link
Author

Thanks for the quick response!
So I added this plugin, and it didn't solve the issue.
Also, note that the GcmNetworkManager is not final

@elyashivlavi
Copy link
Author

Seems like the same issue as #1078 and #1138

@arturdryomov
Copy link

Just a suggestion — you’ll be better off providing some sort of abstraction on top of the GcmNetworkManager. Yes, it might look redundant, but you’ll control the environment and hide platform-related components using an interface.

@bric3 bric3 added android and removed android labels Mar 4, 2019
@TimvdLippe
Copy link
Contributor

Closing per #1078 (comment)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants