2015-08-17 22 views
7

Robolectric'i birim testleri için kullanıyorum, projemde Google Play Hizmetleri var. Bu, Google Play Hizmetleri'nin yeni bir sürüme güncellendiği düne kadar işe yaradı.Robolectric ile sorun, Google Play hizmetlerinin yeni sürümü ile

java.lang.NullPointerException 
at com.google.android.gms.common.GooglePlayServicesUtil.zzh(Unknown Source) 
at com.google.android.gms.common.GooglePlayServicesUtil.zzd(Unknown Source) 
at com.google.android.gms.common.GoogleApiAvailability.isGooglePlayServicesAvailable(Unknown Source) 
at com.google.android.gms.common.api.zzg$zze.zznn(Unknown Source) 
at com.google.android.gms.common.api.zzg$zzi.run(Unknown Source) 
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

Process finished with exit code 255 

O GooglePlayServicesUtil NullPointerException veren denir, Gölge sınıf çağrılmaz görünüyor: Ben bu hatayı alabilirsiniz. Bunu gören oldu mu?

Testlerde Google Play Hizmetlerini bile kullanmıyorum.

+0

NullPointerException, çoğunlukla sınıf gölgelenmediğinde oluşur. Bu hatayı ne zaman alıyorsun? Test çalışması sırasında mı yoksa uygulama yapılandırmanız testten önce mi yüklüyor? – Kanishk

+0

Bunun gölgeli olmadığını biliyorum. GooglePlayServicesUtil için bir gölge sınıfı var ve dün iyi çalışıncaya kadar dünden önce gölgelendi. Robolectric'in GPS'in belirli bir sürümüne bağlı olup olmadığını bulmaya çalıştım, bunu bulamadım. – Christine

+0

Sanırım bunu "Roblectric" konularında [burada] (https://github.com/robolectric/robolectric/issues) veya Android issue tracker [here] 'de (https://code.google.com/p) bildirebilirsiniz./android/issues/list) – bjiang

cevap

4

sonraki geçici çözümü ekledik ve iyi çalışıyor:

  1. Özü tüm PlayServices' ilgili (sadece Durumu çek benim durumumda) Yardımcı sınıfına kod:

    public class PlayServicesUtils { 
    
        private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000; 
    
        public static final int AVAILABLE = 1; 
        public static final int ERROR_RESOLVABLE = 2; 
        public static final int ERROR_UNRESOLVABLE = 3; 
    
        @IntDef({AVAILABLE, ERROR_RESOLVABLE, ERROR_UNRESOLVABLE}) 
        @Retention(RetentionPolicy.SOURCE) 
        public @interface PlayServicesAvailability { 
        } 
    
        @PlayServicesAvailability 
        public static int checkPlayServices(@NonNull Activity activity) { 
         GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance(); 
         int resultCode = apiAvailability.isGooglePlayServicesAvailable(activity); 
         if (resultCode != ConnectionResult.SUCCESS) { 
          if (apiAvailability.isUserResolvableError(resultCode)) { 
           apiAvailability.getErrorDialog(activity, resultCode, PLAY_SERVICES_RESOLUTION_REQUEST).show(); 
           return PlayServicesUtils.ERROR_RESOLVABLE; 
          } else { 
           CLog.e(Constants.TAG, "This device does not support Google Play services."); 
           return PlayServicesUtils.ERROR_UNRESOLVABLE; 
          } 
         } 
         return PlayServicesUtils.AVAILABLE; 
        } 
    } 
    
  2. Bu yardımcı programı sınıfı için donanım:

    @Implements(PlayServicesUtils.class) 
    public class ShadowPlayServicesUtils { 
    
        @Implementation 
        @PlayServicesUtils.PlayServicesAvailability 
        public static int checkPlayServices(@NonNull Activity activity) { 
         return PlayServicesUtils.AVAILABLE; 
        } 
    } 
    
  3. test sınıfına gölge ekleyin (veya tabana seviye testi sınıfı):

    @Ignore 
    @RunWith(TestRunner.class) 
    @Config(
         sdk = 18, 
         constants = BuildConfig.class, 
         shadows = { 
           ShadowPlayServicesUtils.class 
         } 
    ) 
    public abstract class BaseTest { 
        // some code, maybe 
    } 
    
  4. TestRunner en InstrumentationConfiguration yaratılmasına gölgeni ekleyin:

    public class TestRunner extends RobolectricGradleTestRunner { 
        public TestRunner(Class<?> klass) throws InitializationError { 
         super(klass); 
        } 
    
        @Override 
        public InstrumentationConfiguration createClassLoaderConfig() { 
         InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder(); 
    
         builder.addInstrumentedClass(PlayServicesUtils.class.getName()); 
    
         return builder.build(); 
        } 
    } 
    

Orjinal cevap:

Robolectric issue tracker'da similar issue buldum. etrafında sağlanan - çalışır!

@Before public void setUp() { 
    // force success every time 
    ShadowGooglePlayServicesUtil.setIsGooglePlayServicesAvailable(ConnectionResult.SUCCESS); 
} 

EDIT:

Sadece Google başarı başlatılması Play Hizmetleri zorlamak

Ama Play Hizmetleri 8.3 ve 8.4 ile başka issue yoktur. Ve bu sorun hala sabit değil.

+0

Bir ton teşekkürler. 8.4 sürümü ile sorunu çözdükleri zamana kadar, bu harika çalışıyor! –

+0

@ShobhitPuri hoşgeldiniz! – Oleksandr

+0

En son robolectric api'yi değiştirdiği için bu çözümü kullanamıyorum, bu yüzden derleme yapmıyor (testlerimiz yeni sürüme bağlı).Bunu yeni olanla nasıl uygulayacağımı soruyorum: Lütfen bir göz atın: https://stackoverflow.com/questions/48123570/ – Gabor

İlgili konular