2015-08-17 8 views
7

मैं यूनिट परीक्षणों के लिए रोबोलेक्ट्रिक का उपयोग करता हूं, मेरे पास मेरी प्रोजेक्ट में Google Play सेवाएं हैं। यह कल तक काम करता था, जब Google Play Services को एक नए संस्करण में अपडेट किया गया था।Google Play सेवाओं के नए संस्करण के साथ Robolectric के साथ समस्या

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 

ऐसा लगता छाया वर्ग नहीं बुलाया जाता है GooglePlayServicesUtil NullPointerException दे रही है कहा जाता है: मैं इस त्रुटि मिलती है। क्या किसी ने इसे देखा है?

मैं परीक्षण में Google Play सेवाओं का भी उपयोग नहीं करता हूं।

+0

नलपोइंटर एक्सेप्शन ज्यादातर तब होता है जब कक्षा छाया नहीं होती है। आपको यह त्रुटि कब मिल रही है? क्या यह परीक्षण केस चलाने के दौरान है या यह तब होता है जब आपका एप्लिकेशन कॉन्फ़िगरेशन परीक्षण से पहले लोड होता है? – Kanishk

+0

मुझे पता है कि यह छाया नहीं है। GooglePlayServicesUtil के लिए एक छाया श्रेणी है, और कल तक यह अच्छी तरह से काम करता है, यह कल से पहले छायांकित था। मैंने यह पता लगाने की कोशिश की कि क्या Robolectric जीपीएस के एक विशिष्ट संस्करण पर निर्भर करता है, उसे नहीं मिला। – Christine

+0

मुझे लगता है कि आप इसे 'रोलेक्ट्रिक' मुद्दों [यहां] (https://github.com/robolectric/robolectric/issues), या एंड्रॉइड समस्या ट्रैकर [यहां] (https://code.google.com/p) में रिपोर्ट कर सकते हैं/एंड्रॉइड/मुद्दों/सूची) – bjiang

उत्तर

4

मैं अगले वैकल्पिक हल जोड़ दिया है और यह ठीक काम करता है:

  1. निकालें सभी PlayServices ' संबंधित उपयोगिता वर्ग (मेरे मामले में यह सिर्फ उपलब्धता देखने के है) के लिए कोड:

    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. इस उपयोगिता वर्ग के लिए छाया लागू करें:

    @Implements(PlayServicesUtils.class) 
    public class ShadowPlayServicesUtils { 
    
        @Implementation 
        @PlayServicesUtils.PlayServicesAvailability 
        public static int checkPlayServices(@NonNull Activity activity) { 
         return PlayServicesUtils.AVAILABLE; 
        } 
    } 
    
  3. अपने परीक्षण वर्ग के लिए छाया जोड़ें (या आधार के लिए स्तर परीक्षण वर्ग):

    @Ignore 
    @RunWith(TestRunner.class) 
    @Config(
         sdk = 18, 
         constants = BuildConfig.class, 
         shadows = { 
           ShadowPlayServicesUtils.class 
         } 
    ) 
    public abstract class BaseTest { 
        // some code, maybe 
    } 
    
  4. TestRunner के InstrumentationConfiguration निर्माण करने के लिए अपने छाया जोड़ें:

    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(); 
        } 
    } 
    

मूल जवाब:

मुझे रोबॉलेक्ट्रिक इश्यू ट्रैकर और काम पर similar issue मिला है चारों ओर प्रदान किया जाता है - काम करता है!

बस मजबूर गूगल की सफलता initialisation Play सेवाओं:

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

संपादित करें:

लेकिन वहाँ Play सेवाएं 8.3 और 8.4 के साथ एक और issue है। और यह मुद्दा अभी भी तय नहीं है।

+0

धन्यवाद एक टन। जब तक वे इस मुद्दे को 8.4 संस्करण के साथ हल नहीं करते हैं, यह बहुत अच्छा काम करता है! –

+0

@ शोभितपुरी आपका स्वागत है! – Oleksandr

+0

मैं इस समाधान का उपयोग करने में असमर्थ हूं क्योंकि नवीनतम रोबॉलेक्ट्रिक ने एपीआई को बदल दिया है, इसलिए यह संकलित नहीं होगा (हमारे परीक्षण नए संस्करण पर निर्भर करते हैं)।नए प्रश्न के साथ इसे कार्यान्वित करने के बारे में मेरा प्रश्न यहां दिया गया है, कृपया एक नज़र डालें: https://stackoverflow.com/questions/48123570/ – Gabor

संबंधित मुद्दे