2016-09-27 3 views
5

मैं अपने प्रेजेंटर क्लास के लिए एक टेस्ट बनाना चाहता हूं लेकिन मुझे प्रेजेंटर के अंदर कंपोजिटस्क्रिप्शन इंस्टेंस के साथ समस्याएं आ रही हैं। आरएक्सजेवा कंपोजिट सदस्यता के साथ प्रेजेंटर यूनिट टेस्ट

public class Presenter { 

    CompositeSubscription compositeSubscription = new CompositeSubscription(); 
    //creation methods... 

    public void addSubscription(Subscription subscription) { 
     if (compositeSubscription == null || compositeSubscription.isUnsubscribed()) { 
      compositeSubscription = new CompositeSubscription(); 
     } 
     compositeSubscription.add(subscription); 
    } 

    public void getGummyBears() { 
     addSubscription(coreModule.getGummyBears()); 
    } 
} 

CoreModule एक इंटरफेस (एक अलग मॉड्यूल का हिस्सा) है और वहाँ:

java.lang.NullPointerException 
at rx.subscriptions.CompositeSubscription.add(CompositeSubscription.java:60) 
at com.example.Presenter.addSubscription(Presenter.java:67) 
at com.example.Presenter.getGummyBears(Presenter.java:62) 

यह मोटे तौर पर मेरी प्रस्तुतकर्ता वर्ग है: मैं इस त्रुटि मिल रही है जब मैं परीक्षण चलाने एक और वर्ग CoreModuleImpl है जिसमें सभी रेट्रोफिट एपीआई कॉल और सदस्यता के लिए उनके रूपांतरण स्थित हैं। कुछ की तरह:

@Override public Subscription getGummyBears() { 
    Observable<GummyBears> observable = api.getGummyBears(); 
    //a bunch of flatMap, map and other RxJava methods 
    return observable.subscribe(getDefaultSubscriber(GummyBear.class)); 

    //FYI the getDefaultSubscriber method posts a GummyBear event on EventBus 
} 

अब मुझे क्या करना चाहते हैं getGummyBears() विधि का परीक्षण करने के लिए है। मेरे परीक्षण विधि इस प्रकार है:

@Mock EventBus eventBus; 
@Mock CoreModule coreModule; 
@InjectMock CoreModuleImpl coreModuleImpl; 

private Presenter presenter; 

@Before 
public void setUp() { 
    presenter = new Presenter(coreModule, eventBus); 
    coreModuleImpl = new CoreModuleImpl(...); 
} 


@Test 
public void testGetGummyBears() { 
    List<GummyBears> gummyBears = MockBuilder.newGummyBearList(30); 

    //I don't know how to set correctly the coreModule subscription and I'm trying to debug the whole CoreModuleImpl but there are too much stuff to Mock and I always end to the NullPointerException 

    presenter.getGummyBears(); //I'm getting the "null subscription" error here 
    gummyBears.setCode(200); 

    presenter.onEventMainThread(gummyBears); 
    verify(gummyBearsView).setGummyBears(gummyBears); 
} 

मैं पहले से ही विभिन्न परियोजनाओं से कई परीक्षण उदाहरण देखा था, लेकिन कोई भी इस सदस्यता दृष्टिकोण का उपयोग कर रहा है। वे सिर्फ पर्यवेक्षक को लौटते हैं जो सीधे प्रस्तुतकर्ता के अंदर खपत होता है। और उस मामले में मुझे पता है कि एक परीक्षण कैसे लिखा जाना है।

मेरी स्थिति का परीक्षण करने का सही तरीका क्या है?

+0

क्या आप प्रस्तुतकर्ता को 'कोर मॉड्यूल' कन्स्ट्रक्टर में लेते हैं? – skywall

+0

हाँ क्षमा करें मैं 'लाइनअप' विधि – nicopasso

+0

में इस लाइन 'प्रस्तुतकर्ता = नया प्रेजेंटर (कोर मॉड्यूल, इवेंटबस)' जोड़ने के लिए भूल गया था हाय @nicopasso क्या आपको इसे हल करने का कोई तरीका मिल सकता है? –

उत्तर

1

ऐसा लगता है कि coreModule.getGummyBears() शून्य लौट रहा है। बस डीबग के साथ कदम उठाएं और यह बहुत स्पष्ट होना चाहिए। मॉकिंग फ्रेमवर्क का उपयोग करते समय आप मॉक ऑब्जेक्ट पर विधि कॉल से वापस लौट सकते हैं जब आपने यह निर्दिष्ट नहीं किया है कि उस मॉक ऑब्जेक्ट पर विधि कॉल को वापस क्यों करना चाहिए।

+0

असल में कोड प्रश्न में लिखे गए एक से अधिक जटिल है। "कोर मॉड्यूल" कक्षा एक इंटरफ़ेस है और एक और वर्ग "coreImpl" है जो इस इंटरफ़ेस को लागू करता है। मैंने अपनी परियोजना संरचना के अनुसार अपना प्रश्न अपडेट कर लिया है। – nicopasso

0

जैसा कि डेव ने उल्लेख किया है, आपको CoreModule.getGummyBears के वापसी मूल्य का नकल करने की आवश्यकता है। एक अजीब चीज यह है कि आप CoreModuleImpl का उपयोग नहीं कर रहे हैं। इसके बजाय, आप प्रस्तुतकर्ता के निर्माता को coreModule पास कर रहे हैं।

आप कुछ इस तरह कर रही द्वारा getGummyBears() नकली कर सकते हैं:

when(coreModule.getGummyBears()).thenReturn(MockBuilder.newGummyBearList(30); 

फिर विशिष्ट त्रुटि आप का सामना कर रहे सुलझाया जाना चाहिए। ऐसा लगता है कि इस विशिष्ट परीक्षण मामले के लिए आपको CoreModuleImpl की आवश्यकता नहीं है।

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