Is there any way to test activity which loads SupportMapFragment?

531 views
Skip to first unread message

Michał Brzeziński

unread,
Apr 25, 2016, 5:20:59 PM4/25/16
to Robolectric
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)



Евгений Хохряков

unread,
Jul 27, 2016, 2:43:43 PM7/27/16
to Robolectric
Robolectric cant find SERVICE, thats why it cannot create SupportMapFragment. I found sulution to redefine onCreateView method for extended MyFragment class from SupportMapFragment. Lets define it on fragment section in layout directory and test MyFragment and get map object as well.

See also http://stackoverflow.com/questions/38219749/error-inflating-class-fragment-cant-get-fragmentmanager-in-google-play-service/38557428#38557428

вторник, 26 апреля 2016 г., 1:20:34 UTC+3:59.58333333333334 пользователь Michał Brzeziński написал:
Reply all
Reply to author
Forward
0 new messages