2015-10-10 14 views
5

पर निर्भर नहीं है, मैं इकाई परीक्षण को बढ़ाने और परीक्षणों को तेज़ी से चलाने के लिए एमवीपी का उपयोग करने की कोशिश कर रहा हूं (क्योंकि मैं तर्क का परीक्षण कर रहा हूं एंड्रॉइड कोड नहीं, इसलिए मैं रोबोटइलेक्ट्रिक जैसी चीजों का उपयोग करने से बचता हूं)।जुनीट शेड्यूलर जो एंड्रॉइड

लेकिन मैं RXAndroid और यह जरूरत Looper का उपयोग कर Schedulers.io() और AndroidSchedulers.mainThread() हो और जब मैं

कुछ समय की तरह
class Phone { 
    public Observable<> sendSms(String number){ 
     //... 
    } 
} 

Phone.getInstance().sendSms(phoneNumber) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(phone -> { 
        mView.dismissProgress(); 
        mView.startCodeView(phone); 
       }, error -> { 
        mView.dismissProgress(); 
        mView.showError(error); 
       }); 

चलाने का प्रयास मैं:

Caused by: java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details. 
at android.os.Looper.getMainLooper(Looper.java) 
at rx.android.schedulers.AndroidSchedulers.<clinit>(AndroidSchedulers.java:27) 
... 28 more 

मैंने कोशिश की:

android { 
    // ... 
    testOptions { 
    unitTests.returnDefaultValues = true 
    } 
} 

लेकिन यह काम नहीं करेगा क्योंकि मैं पूर्ण जुनीट परीक्षण चलाने के लिए चाहता हूं और रोबो नहीं बिजली या एस्प्रेसो सामान।

मैं इसे कैसे पूरा कर सकता हूं? क्या कोई शेड्यूलर है जो इस वजह से दुर्घटनाग्रस्त नहीं होगा?

उत्तर

20

, लेकिन में:

public class Transformer { 

    public static <T> Observable.Transformer<T, T> applyIoSchedulers() { 
    return observable -> observable.subscribeOn(getIoScheduler()) 
     .observeOn(getMainScheduler()); 
    } 

    private static Scheduler getIoScheduler() { 
    return Schedulers.immediate() ; 
    } 

    private static Scheduler getMainScheduler() { 
    return Schedulers.immediate() ; 
    } 
} 

तब परिवर्तनों के साथ उपयोग करें मेरा परीक्षण सेटअप और टीयरडाउन।

@Before 
    public void setUp() throws Exception { 
     RxAndroidPlugins.getInstance().registerSchedulersHook(new RxAndroidSchedulersHook() { 
      @Override 
      public Scheduler getMainThreadScheduler() { 
       return Schedulers.immediate(); 
      } 
     }); 
} 

@After 
    public void tearDown() { 
     RxAndroidPlugins.getInstance().reset(); 
    } 

क्या यह मदद मिलेगी?

+0

क्या शेड्यूलर्स.ओ() के लिए कोई हुक है? – Caipivara

+0

RxJavaPlugins.getInstance() है। पंजीकरण करें ...भी :) – Caipivara

+0

@danielgomezrico हाँ, लेकिन मैंने इसका उपयोग नहीं किया है, अगर आप अंतर्दृष्टि डाल सकते हैं या –

3

हमारे अभ्यास में, हम प्रेजेंटर में AndroidSchedulers.mainThread() का उपयोग करने से बचने की कोशिश करते हैं क्योंकि यह View कार्यान्वयन का विवरण है। आप भी यह कर सकते हैं।

हालांकि हम Robolectric का उपयोग करते हैं, फिर भी यह हमारे परीक्षणों में काम करेगा।

+0

मैं रोबोलेट्रिक के बारे में थोड़ा संदिग्ध हूं, मैं परीक्षण के लिए तत्काल शेड्यूलर का उपयोग कर समाप्त हुआ। – Caipivara

+1

@danielgomezrico आपने परीक्षण के लिए तत्काल शेड्यूलर का उपयोग कैसे किया? क्या आप अभी भी परीक्षण के बाहर AndroidScheduelrs.mainThread() का उपयोग कर रहे हैं? आप विकृति कैसे बना रहे हैं? धन्यवाद – drees

+0

@drees मैं स्वाद इंजेक्शन कक्षाओं का उपयोग कर रहा हूं, मेरे पास एक कक्षा है जो प्रोड/डीबग रिलीज के लिए मुख्य का उपयोग करती है और परीक्षण के लिए स्वाद फ़ोल्डर में किसी अन्य वर्ग का उपयोग करती है। मैं अभी भी परीक्षण के लिए Schedulers.immediate() का उपयोग कर रहा हूँ। – Caipivara

2

जूनिट परीक्षणों में यूप, कोई android.jar का मतलब कोई लूपर्स नहीं है। यदि आप डैगर का उपयोग करते हैं तो आप परीक्षण में एक नकली शेड्यूलर और स्रोत कोड में वास्तविक शेड्यूलर इंजेक्ट कर सकते हैं। आप शेड्यूलर को नकल करने के लिए मॉकिटो जैसे कुछ भी इस्तेमाल कर सकते हैं। अन्यथा @Artem Zinnatullin की तरह सुझाव दिया, Robolectric इस समस्या हल करता है। एंड्रॉइड स्टूडियो के साथ रोबोलेक्ट्रिक 3 सेट करना बहुत आसान है।

+0

मैं रोबोइलेक्ट्रिक से बचने की कोशिश कर रहा हूं, लेकिन धन्यवाद। – Caipivara

5

मैं इसके लिए परिवर्तनों और "स्वाद इंजेक्शन कक्षाओं" का उपयोग करके जोड़ना समाप्त कर दिया, एक वर्ग है जो प्रोड/डीबग रिलीज के लिए मुख्य का उपयोग करता है और Schedulers.immediate() परीक्षण के लिए परीक्षण स्वाद फ़ोल्डर में किसी अन्य वर्ग का उपयोग करता है।

सामान्य स्वाद वर्ग:

public class Transformer { 

    public static <T> Observable.Transformer<T, T> applyIoSchedulers() { 
    return observable -> observable.subscribeOn(getIoScheduler()) 
     .observeOn(getMainScheduler()); 
    } 

    private static Scheduler getIoScheduler() { 
    return Schedulers.io(); 
    } 

    private static Scheduler getMainScheduler() { 
    return AndroidSchedulers.mainThread(); 
    } 
} 

परीक्षण स्वाद वर्ग: मैं भी इस के लिए अनुसूचक धागा उपयोग कर रहा हूँ

mSessionRepository.login(...) 
     .compose(Transformer.applyIoSchedulers()) 
     .subscribe(session -> { }) 
संबंधित मुद्दे