2012-10-24 8 views
12

मैं निम्नलिखित गतिविधि हैपरीक्षण onActivityResult()

package codeguru.startactivityforresult; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

public class StartActivityForResult extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     this.startButton = (Button) this.findViewById(R.id.start_button); 
     this.startButton.setOnClickListener(onStart); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     int result = data.getIntExtra(StartActivityForResult.this.getString(R.string.result), -1); 
     String msg = "requestCode=" + requestCode + ", resultCode=" + resultCode + ", result=" + result; 
     Toast.makeText(this, msg, Toast.LENGTH_LONG).show(); 
    } 

    private View.OnClickListener onStart = new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(StartActivityForResult.this, ChildActivity.class); 

      StartActivityForResult.this.startActivityForResult(intent, R.id.child_request); 
     } 
    }; 
    private Button startButton = null; 
} 

और निम्नलिखित JUnit परीक्षण:

package codeguru.startactivityforresult; 

import android.app.Activity; 
import android.app.Instrumentation; 
import android.test.ActivityInstrumentationTestCase2; 
import android.test.UiThreadTest; 
import android.widget.Button; 
import junit.framework.Assert; 

public class StartActivityForResultTest extends ActivityInstrumentationTestCase2<StartActivityForResult> { 

    public StartActivityForResultTest() { 
     super(StartActivityForResult.class); 
    } 

    @Override 
    public void setUp() throws Exception { 
     super.setUp(); 

     this.setActivityInitialTouchMode(false); 

     this.activity = this.getActivity(); 
     this.startButton = (Button) this.activity.findViewById(R.id.start_button); 
    } 

    @Override 
    public void tearDown() throws Exception { 
     this.activity.finish(); 

     super.tearDown(); 
    } 

    @UiThreadTest 
    public void testStartButtonOnClick() { 
     Assert.assertTrue(this.startButton.performClick()); 

     Instrumentation.ActivityResult result = new Instrumentation.ActivityResult(Activity.RESULT_OK, null); 
     Assert.assertNotNull(result); 

     Instrumentation.ActivityMonitor am = new Instrumentation.ActivityMonitor(ChildActivity.class.getName(), result, true); 
     Assert.assertNotNull(am); 

     Activity childActivity = this.getInstrumentation().waitForMonitorWithTimeout(am, TIME_OUT); 
     Assert.assertNotNull(childActivity); 

     Assert.fail("How do I check that StartActivityForResult correctly handles the returned result?"); 
    } 
    private Activity activity = null; 
    private Button startButton = null; 
    private static final int TIME_OUT = 5 * 1000; // 5 seconds 
} 

आप देख सकते हैं, मैं कैसे पता लगा Instrumentation.ActivityResult का उपयोग कर एक परिणाम के नकली करने के लिए और Instrumentation.ActivityMonitor। मैं कैसे जांच कर लें कि StartActivityForResult.onActivityResult() ठीक से इस परिणाम हैंडल करते हैं?

+0

सवाल के साथ कोई लिंक है, लेकिन 'लिखने के Assert.assert * (...)' कोई जरूरत नहीं है, के बाद से '' ActivityInstrumentationTestCase2' फैली junit.framework.Assert': 'ज़ोर * (...)' है एक उदाहरण विधि, और सीधे कहा जा सकता है। – Vince

+1

@Vince हाँ, मैं इस के बारे में पता कर रहा हूँ। मैं व्यक्तिगत रूप से इस विशेष उपयोग को प्राथमिकता देता हूं क्योंकि सभी 'assert *() 'विधियां स्थिर हैं। –

उत्तर

1

उपयोग उद्देश्य ढांचे गतिविधि परिणाम

intending(hasComponent(DummyActivity.class.getName())).respondWith(new ActivityResult(resultCode, dataIntent)); 
rule.getActivity().startActivityForResult(new Intent(context,DummyActivity.class)); 

गतिविधि परिणाम तर्क पर यह सत्यापित उपहास करने के लिए

+०१२३५१६४१०
-2

नीचे साइटों देखें। यह आपकी समस्या को हल करने में आपकी मदद करेगा। http://saigeethamn.blogspot.in/2009/08/android-developer-tutorial-for_31.html

http://android-er.blogspot.in/2011/08/return-result-to-onactivityresult.html

http://www.mubasheralam.com/tutorials/android/how-start-new-activity-and-getting-results

+0

जैसा कि आप मेरे कोड से देख सकते हैं, मुझे पता है कि मेरी 'StartActivityForResult' गतिविधि में'ActivityResult() 'का उपयोग कैसे करें। मेरा सवाल यह है कि यह सुनिश्चित करने के लिए कि यह सही ढंग से व्यवहार करता है, एक जुनीट परीक्षण कैसे लिखना है। –

9

परीक्षण onActivityResult के लिए() अपने परीक्षण कक्षा में, तुम सब करने की जरूरत है:

  1. एक ActivityMonitor जो ChildActivity निर्माण को पकड़ने और नकली retuning बनाएं ActivityResult।
  2. बटन क्लिक जो परिणाम के लिए ChildActivity शुरू अनुकरण।
  3. स्थिति और नकली ActivityResult पर कुछ दावे करते हैं।

नमूना StartActivityForResult:

public class StartActivityForResult extends Activity { 
    private boolean activityResultIsReturned = false; 
    private String activityResult = null; 

    ... ... 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    activityResultIsReturned = true; 
    activityResult = data.getStringExtra("result"); 

    ... ... 
    } 

    ... ... 
} 

नमूना StartActivityForResultTest:

public class StartActivityForResultTest extends ActivityInstrumentationTestCase2<StartActivityForResult> { 
    ... ... 

    public void testOnActivityResult() { 
    // Get current Activity and check initial status: 
    StartActivityForResult myActivity = getActivity(); 
    assertFalse(myActivity.getActivityResultIsReturned()); 
    assertNull(myActivity.getActiityResult()); 

    // Mock up an ActivityResult: 
    Intent returnIntent = new Intent(); 
    returnIntent.putExtra("result", "This is the result"); 
    Instrumentation.ActivityResult activityResult = new Instrumentation.ActivityResult(Activity.RESULT_OK, returnIntent); 

    // Create an ActivityMonitor that catch ChildActivity and return mock ActivityResult: 
    Instrumentation.ActivityMonitor activityMonitor = getInstrumentation().addMonitor(ChildActivity.class.getName(), activityResult , true); 

    // Simulate a button click that start ChildActivity for result: 
    final Button button = (Button) myActivity.findViewById(com.company.R.id.open_next_activity); 
    myActivity.runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
     // click button and open next activity. 
     button.performClick(); 
     } 
    }); 

    // Wait for the ActivityMonitor to be hit, Instrumentation will then return the mock ActivityResult: 
    ChildActivity childActivity = getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 5); 

    // How do I check that StartActivityForResult correctly handles the returned result? 
    assertTrue(myActivity.getActivityResultIsReturned()); 
    assertEqual(myActivity.getActiityResult(), "This is the result"); 
    } 

    ... ... 
} 
+0

सुझावों के लिए धन्यवाद। मूल पोस्ट में मेरी StartActivityForResult क्लास बस एक उदाहरण है। मेरे असली आवेदन में, मेरे पास परीक्षण करने के लिए करीब दर्जन अलग-अलग गतिविधियां हैं। इनमें से कुछ गतिविधियां डेटा के एक से अधिक टुकड़े लौटती हैं। आपका टेस्ट कोड बताता है कि मुझे बाल गतिविधि द्वारा लौटाए गए डेटा के प्रत्येक टुकड़े के लिए गेटर्स जोड़कर परीक्षण के लिए प्रत्येक गतिविधि के इंटरफ़ेस को संशोधित करना होगा। मुझे इस कोड को लिखने के अतिरिक्त काम पर कोई फर्क नहीं पड़ता। मैं कोड के साथ उत्पादन कोड को प्रदूषित करने से पूरी तरह से संतुष्ट नहीं हूं जिसका प्रयोग केवल परीक्षण के लिए किया जाता है। –

+0

ये केवल यह दिखाने के लिए नमूने हैं कि एक्टिविटी रिसैट() पर परीक्षण कैसे करें और कुछ बुनियादी दावे करें, अपनी मांग पर निर्भर करते हैं, आपको सभी मामलों में अपनी गतिविधि कक्षा में बदलाव की आवश्यकता नहीं है, उदाहरण के लिए, यदि आपके सभी एक्टिविटी रिसेट() कुछ अपडेट हैं यूआई सामान यानी एक टेक्स्ट व्यू, आप सीधे किसी भी आवृत्ति चर और गेटर/सेटर विधियों को जोड़ने के बिना अद्यतन पाठ की जांच कर सकते हैं। – yorkw

+0

यह एक अच्छा मुद्दा है। मुझे लगता है कि ज्यादातर समय 'atActivityResult()' यूआई को कुछ तरीकों से संशोधित करेगा, जैसा कि आपने कहा था। –

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