2016-04-15 5 views
6

के साथ काम नहीं कर रहा है। मैं एक प्रेजेंटर का परीक्षण करने की कोशिश कर रहा हूं जो एक इंटरैक्टर से डेटा पुनर्प्राप्त करने के लिए आरएक्सजेवा का उपयोग करता है। सेटअप विधि में मैं की तरह कुछ कर रहा हूँ:शेड्यूलर्स.मीडिएट() कमांड लाइन ग्रेडल परीक्षण

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

तो मेरी परीक्षा पद्धति में मैं प्रस्तोता कॉल का परीक्षण कर सकते हैं:

@Test 
public void testLoad() { 
    presenter.load(); 
    verify(view).dataLoaded(data); 
    verify(interactor).load(); 
} 

मैं के साथ एंड्रॉयड स्टूडियो सब कुछ काम परीक्षण चलाते हैं अपेक्षा के अनुरूप, मुद्दा यह है कि अगर मैं कमांड लाइन पर कोशिश

gradle test 

फिर परीक्षण विफल हो जाता है क्योंकि: Actually, there were zero interactions with this mock.

इसलिए मैंने प्रस्तुतकर्ता को कॉल के बाद एक थ्रेड.sleep (2000) डालने का प्रयास किया है और फिर यह काम करता है, इसलिए मुझे लगता है कि शेड्यूलर्स.मीडिएट(); कमांड लाइन से काम नहीं कर रहा है, लेकिन मुझे नहीं पता कि क्यों और कैसे डीबग/फिक्स करना है। क्या तुम्हारे पास कोई विचार है?

संपादित करें: प्रस्तोता कार्यान्वयन ->

public void load() { 
    Observable<List<Data>> obs = interactor.load() 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribeOn(Schedulers.io()); 
    obs.subscribe(new Observer<List<Data>>() { 
     @Override 
     public void onCompleted() { 

     } 

     @Override 
     public void onError(Throwable e) { 

     } 

     @Override 
     public void onNext(List<Data> data) { 
      view.dataLoaded(data); 
     } 
    }); 
} 
+0

क्या आप इसे प्राप्त करने के लिए 'getMainThreadScheduler' में कुछ लॉग जोड़ सकते हैं? आपके कोड में अन्य दौड़ की स्थिति हो सकती है। यह दिखाने के लिए बहुत अच्छा होगा कि आप अपने कोड में शेड्यूलर का उपयोग कैसे करते हैं। – zsxwing

+0

आपका 'लोड' कार्यान्वयन एसिंक्रोनस है (शेड्यूलर्स.ओ() में सदस्यता लिया गया है)। इसलिए आपको एक बार में 'लोड' कॉल करने के बाद सत्यापित नहीं करना चाहिए। – zsxwing

+0

हाँ आप सही हैं, मैंने वास्तव में प्रस्तुतकर्ता में आरएक्सजेवा की सभी निर्भरता को हल करने का हल किया है, इसलिए एक रैपर है जो आरएक्सजेवा कहता है लेकिन परीक्षण में मैं एक अलग रैपर का उपयोग कर रहा हूं जो आरएक्सजेवा का उपयोग नहीं करता है। अंत में, मैं rxjava का परीक्षण नहीं करना चाहता लेकिन मेरे प्रस्तुतकर्ता का तर्क :) –

उत्तर

0

आप RxJava Schedulers रूप में अच्छी तरह नकली कर सकते हैं।

RxJavaHooks.reset(); 
RxJavaHooks.setOnIOScheduler(scheduler -> Schedulers.immediate()); 

आमतौर पर एक अच्छी बात सेटअप & टियरडाउन पर रीसेट कॉल करने के लिए।