2012-02-15 20 views
9

मेरा पहला एंड्रॉइड-बाय-टीडीडी ऐप लिखने का प्रयास (मैंने टीडीडी के बिना कुछ छोटे एंड्रॉइड ऐप्स लिखे हैं, इसलिए पर्यावरण से परिचित हैं), लेकिन मुझे लगता है कि मेरा पहला सिर कैसे लिखना है परीक्षा।यूनिट परीक्षण गतिविधि .startService() कॉल?

परिदृश्य:

मैं एक गतिविधि, TasksActivity, और एक सेवा, TasksService है। मुझे यह जांचने की ज़रूरत है कि टास्क एक्टिविटी टास्क सेवा को ऑनस्टार्ट() विधि में शुरू करती है।

public class ServiceControlTest extends ActivityUnitTestCase<TasksActivity>{ 
public ServiceControlTest() { 
    super(TasksActivity.class); 
} 

public void testStartServiceOnInit() { 
    final AtomicBoolean serviceStarted = new AtomicBoolean(false); 
    setActivityContext(new MockContext() { 
     @Override 
     public ComponentName startService(Intent service) { 
      Log.v("mockcontext", "Start service: " + service.toUri(0)); 
      if (service.getComponent().getClassName().equals (TasksService.class.getName())) 
       serviceStarted.set(true); 
      return service.getComponent(); 
     } 
    }); 
    startActivity(new Intent(), null, null); 
    assertTrue ("Service should have been started", serviceStarted.get()); 
}   
} 

TasksActivity में मेरी OnCreate() विधि में मेरे पास है:

startService(new Intent(this, TasksService.class)); 

मैं भी

getBaseContext().startService(new Intent(this, TasksService.class)); 

की कोशिश की है लेकिन

परीक्षण मैं लिखा है यह है किसी भी मामले में मेरी MockContext की प्रारंभ सेवा विधि को कॉल नहीं किया जाता है। क्या कोई तरीका है कि मैं इस विधि के अवरोध को स्थापित कर सकता हूं? मुझे वास्तव में बुनियादी परीक्षण करने के लिए बुनियादी एंड्रॉइड एपीआई को लपेटना शुरू नहीं करना पड़ेगा ...

+0

आपने जांच लिया है कि अपने 'Activity' के' OnCreate() 'विधि उपकरण के माध्यम से बुलाया जा रहा है? मैं वहां जो कुछ भी कर रहा हूं उसके साथ मुझे कुछ भी गलत नहीं दिख रहा है। –

+0

अब, यह दिलचस्प है। यह नहीं है न ही इसे बुलाया जाता है अगर मैं स्पष्ट रूप से प्राप्त करता हूं इंस्ट्रुमेंटेशन()। कॉलएक्टिविटीऑनक्रेट (...)। लेकिन यह * कहा जाता है * अगर मैं अपने नकली संदर्भ पर टिप्पणी करता हूं ... कॉल को पारित करने के लिए संदर्भ पर कुछ निर्भरता होनी चाहिए। – Jules

+0

यूप। यह पाया (http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-2/), एक नज़र डालें। अनिवार्य रूप से, 'मॉककॉन्टेक्स्ट' लगभग पूरी तरह से बेकार है :)। –

उत्तर

6

टिप्पणियों में ब्रायन डुप्यूस के साथ वार्तालाप को सारांशित करने के लिए, समस्या यह थी कि MockContext ऐसी सुविधाएं प्रदान नहीं करता है onCreate() पर सही ढंग से कॉल करने के लिए परीक्षण उपकरण द्वारा आवश्यक हैं। MockContext से ContextWrapper पर स्विच करें इस समस्या को हल करें।

काम कर परीक्षण इसलिए इस तरह दिखता है:

public void testStartServiceOnInit() { 
    final AtomicBoolean serviceStarted = new AtomicBoolean(false); 
    setActivityContext(new ContextWrapper(getInstrumentation().getTargetContext()) { 
     @Override 
     public ComponentName startService(Intent service) { 
      Log.v("mockcontext", "Start service: " + service.toUri(0)); 
      if (service.getComponent().getClassName().equals ("net.meridiandigital.tasks.TasksService")) 
       serviceStarted.set(true); 
      return service.getComponent(); 
     } 
    }); 
    startActivity(new Intent(), null, null); 
    assertTrue ("Service should have been started", serviceStarted.get()); 
} 
+1

गतिविधिटेस्टकेस और मॉककॉन्टेक्स्ट के बहिष्कार के साथ, मूल समाधान का विकल्प है? धन्यवाद! –

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