I've tried different approaches with different version of Robolectric and Google Play Services but no luck. To be precise, I was trying Robolectric 3.0, 3.1-snapshot and brand new 3.1-rc1. For Google Play Services: 7.5.0, 8.4.0 and some versions between.
However I try to load SupportMapFragment, it fails.
After more digging, from these two issues:
https://github.com/robolectric/robolectric/issues/1956 and
https://github.com/robolectric/robolectric/issues/1145 I conclude that if I'm using com.google.android.gms.maps.GoogleMap (
getMapAsync(OnMapReadyCallback callback) from SupportMapFragment) then I'm out of luck, right?
I've read that one way is to call
GooglePlayServicesUtil.isGooglePlayServicesAvailable(Context context) and when Robolectric returns SERVICE_MISSING - just omit loading SupportMapFragment. While this may sound like a valid workaround, it's not enough for me, as my app main functionality is map-oriented.
Is there any way to handle SupportMapFragment and maybe even have some interaction with it?
If there is any hope, below is the stacktrace where I'm stuck (after shadowing
isGooglePlayServicesAvailable to respond SUCCESS):
Caused by: java.lang.IllegalStateException: Unable to find dynamic class com.google.android.gms.maps.internal.CreatorImpl
at com.google.android.gms.maps.internal.zzy.zza(Unknown Source)
at com.google.android.gms.maps.internal.zzy.zzaA(Unknown Source)
at com.google.android.gms.maps.internal.zzy.zzay(Unknown Source)
at com.google.android.gms.maps.MapsInitializer.initialize(Unknown Source)
at com.google.android.gms.maps.SupportMapFragment$zzb.zzvu(Unknown Source)
at com.google.android.gms.maps.SupportMapFragment$zzb.zza(Unknown Source)
at com.google.android.gms.dynamic.zza.zza(Unknown Source)
at com.google.android.gms.dynamic.zza.onCreate(Unknown Source)
at com.google.android.gms.maps.SupportMapFragment.onCreate(Unknown Source)
at android.support.v4.app.Fragment.performCreate(Fragment.java:1766)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:917)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
at android.support.v4.app.Fragment.performStart(Fragment.java:1810)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:989)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:437)
at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:138)
at android.app.Activity.performResume(Activity.java:6032)
at org.robolectric.util.ReflectionHelpers$3.run(ReflectionHelpers.java:162)
at org.robolectric.util.ReflectionHelpers.traverseClassHierarchy(ReflectionHelpers.java:305)
at org.robolectric.util.ReflectionHelpers.callInstanceMethod(ReflectionHelpers.java:156)
at org.robolectric.util.ComponentController$1.run(ComponentController.java:74)
at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:340)
at org.robolectric.shadows.CoreShadowsAdapter$2.runPaused(CoreShadowsAdapter.java:42)
at org.robolectric.util.ComponentController.invokeWhilePaused(ComponentController.java:71)
at org.robolectric.util.ActivityController.resume(ActivityController.java:164)