2010-12-01 12 views
18

मैं एक वर्ग के लिए एंड्रॉइड जुनीट टेस्ट लिख रहा हूं जो एक इरादे से पारित अतिरिक्त पर निर्भर करता है। मैं कक्षा को ठीक तरह से काम करने में सक्षम था, लेकिन मैं अभी भी जानना चाहूंगा कि इस तरह के वर्ग के लिए यूनिट टेस्ट कैसे लिखना है, क्योंकि परीक्षण अभी भी विफल रहता है।मेरी गतिविधि एक एंड्रॉइड जुनीट टेस्ट कैसे लिख सकती है जब मेरी गतिविधि किसी इरादे से पारित एक्स्ट्रा पर निर्भर करती है?

public class AddClassEvent extends Activity{ 
private String eventType; 

    @Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Bundle extras = getIntent().getExtras(); 
    final String cNo = extras.getString("CourseNum"); 

    // create a model instance 
    final StudentDBModel model = new StudentDBModel(this); 

    setContentView(R.layout.add_class_event); 
..... 
..... 
     } 
    } 

परीक्षण वर्ग की तरह दिखता है ...

public class AddClassEventTest extends ActivityInstrumentationTestCase2<AddClassEvent>{ 
private StudentDBModel model = null; 
private RenamingDelegatingContext context = null; 

public AddClassEventTest() { 
    super("com.UI", AddClassEvent.class); 
} 

/** 
    * This method is called before each test. 
    */ 
@Override 
public void setUp() { 
    context = new RenamingDelegatingContext(getActivity(), "test_"); 
    model = new StudentDBModel(context); 
} 

/* 
    * This function will test addNewClassEvent() from StudentDBModel 
    */ 
public void testAddNewClassEvent(){ 

    ContentValues courseValues = new ContentValues(); 
    courseValues.put("CourseId", "60-415"); 
    courseValues.put("CourseName", "Advanced Database Design"); 
    courseValues.put("Section", "1"); 
    courseValues.put("Location", "Erie"); 
    courseValues.put("Credit", "3"); 
    courseValues.put("ProfEmail", "[email protected]"); 
    courseValues.put("Website", "cs.uwindsor.ca"); 

    model.addNewCourses(courseValues); 

    int numEventsBefore = model.getNumClassEvents(); 

    ContentValues values = new ContentValues(); 

    values.put("EventName", "Assignment 1"); 
    values.put("CourseId", "60-415"); 
    values.put("EventType", "Assignment"); 
    values.put("EventWeight", "8"); 
    values.put("DueDate", "10/20/2010"); 

    model.addNewClassEvent(values); 

    int numEventsAfter = model.getNumClassEvents(); 

    assertEquals(numEventsBefore + 1, numEventsAfter); 
} 
} 

समस्या है, अतिरिक्त है कि मैं वर्ग AddClassEvent को गुजर रहा हूँ कि एक और कक्षा में बनाया है और पारित हो जाता है मेरी DB के लिए एक पी है एक इरादे के माध्यम से AddClassEvent करने के लिए। जब भी मैं परीक्षण चलाने मैं लाइन पर पर एक नल पॉइंटर एक्सेप्शन मिलती है:

final String cNo = extras.getString("CourseNum"); 

मैं JUnit टेस्ट में अतिरिक्त जानकारी से कैसे बनाऊं? क्या इस परीक्षा को काम करने का कोई तरीका है? मैंने बड़े पैमाने पर खोज की है और मुझे कोई जवाब नहीं मिल रहा है। क्या जुनीट टेस्ट में अतिरिक्त रूप से अतिरिक्त बनाने का कोई तरीका है ताकि ऐसा लगता है कि यह दूसरे वर्ग द्वारा बनाया जा रहा है? यदि हां, तो क्या कोई मुझे दिखा सकता है कि कैसे?


ठीक तो मैं आपकी सलाह लेने की कोशिश की है और मैं करने के लिए मेरे सेटअप समारोह बदल दिया है:

@Override 
public void setUp() { 
    context = new RenamingDelegatingContext(getActivity(), "test_"); 
    model = new StudentDBModel(context); 
    Intent addEvent = new Intent(); 
    addEvent.setClassName("com.UI", "com.UI.AddClassEvent"); 
    addEvent.putExtra("CourseNum", "60-415"); 
    setActivityIntent(addEvent); 
    getActivity(); 
} 

लेकिन मैं अभी भी एक नल पॉइंटर एक्सेप्शन हो रही है। क्या मेरा वाक्यविन्यास गलत है? कोई सुझाव?

+1

जब आप putExtra() का उपयोग करते हैं तो आपको नाम के साथ एक पैकेज उपसर्ग शामिल करने की आवश्यकता होती है। पूर्व: addEvent.putExtra ("com.ui.CourseNum", "60-415"); – McStretch

उत्तर

18

आपके द्वारा प्राप्त कक्षा, ActivityInstrumentationTestCase2, आपको Intent एस का नकल करने की अनुमति देता है। documentation से:

आप अपनी गतिविधि में कस्टम इरादों को इंजेक्ट कर सकते हैं (सेट एक्टिविटी इंटेंट (इरादा) देखें)।

setActivityIntent के लिए दस्तावेज़() आगे स्पष्ट:

कॉल पहले कॉल getActivity करने से पहले इस विधि() एक अनुकूलित आशय गतिविधि में परीक्षण के अंतर्गत इंजेक्षन करने के लिए।

यदि आप इसे कॉल नहीं करते हैं, तो डिफ़ॉल्ट मंशा प्रदान किया जाएगा। यदि आप पर कॉल करते हैं तो आपकी गतिविधि शुरू होने के बाद, इसका कोई प्रभाव नहीं पड़ेगा।

तो आप अपने setUp() अपने कॉल करने से पहले getActivity() के अंदर इस पद्धति को कॉल करने में सक्षम होना चाहिए। आप सेट किए गए एक्टिविटी इंटेंट में एक मॉक किए गए इरादे में पारित कर सकते हैं जैसे कि आपने उल्लेख किया है - केवल अतिरिक्त के साथ एक नकली इरादा बनाएं जिससे आप गतिविधि को देखने की उम्मीद कर सकें।

+0

ठीक है, उत्तर के लिए धन्यवाद। मैं कोशिश करूँगा और अपने परिणाम पोस्ट करूंगा। –

+1

मैंने आपकी सलाह की कोशिश की, लेकिन अभी भी नल पॉइंटर अपवाद प्राप्त हो रहा है। मैंने उपरोक्त मेरे सेटअप फ़ंक्शन में अपने परिवर्तनों के लिए कोड जोड़ा है। –

+0

यह समाधान अच्छी तरह से काम करता है - धन्यवाद! –

12

ठीक है, मैंने अपनी गलती का पता लगाया! सेटअप के लिए कोड गलत क्रम में था। यह इस तरह दिखना चाहिए:

@Override 
public void setUp() { 
    Intent addEvent = new Intent(); 
    addEvent.setClassName("com.UI", "com.UI.AddClassEvent"); 
    addEvent.putExtra("CourseNum", "60-415"); 
    setActivityIntent(addEvent); 
    context = new RenamingDelegatingContext(getActivity(), "test_"); 
    model = new StudentDBModel(context); 
} 

मैं दो बार निष्क्रियता() को कॉल कर रहा था और पहला कॉल इरादे से आगे था। सही क्रम का उपयोग करके, परीक्षण ठीक चलाता है। McStretch मदद के लिए धन्यवाद।

+3

कृपया अपना उत्तर या मेरा स्वीकार्य रूप से चिह्नित करें ताकि प्रश्न बंद हो। – McStretch

+0

एक साइड सवाल ... यह नामकरण कैसे करता है संदर्भ संदर्भ गतिविधि को प्रभावित करता है? जैसा कि मैंने देखा है कि आपके पास मॉडल के लिए केवल एक अलग संदर्भ है, गतिविधि के लिए नहीं। –

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