2012-02-15 16 views
9

İlk Android-TDD uygulamasını yazmaya çalışıyorum (TDD'siz birkaç küçük Android uygulaması yazdım, bu yüzden çevreye aşina oldum), ama başımı nasıl yazacağım konusunda kafamı çekemiyorum. Ölçek.Birim testi Activity.startService() çağrısı?

senaryo:

Ben bir etkinlik, TasksActivity ve bir hizmeti TasksService var. TasksActivity'nin TasksService'i onStart() yönteminde başladığını test etmem gerekiyor.

TasksActivity benim onCreate() yönteminde
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()); 
}   
} 

Ben:

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

Ben de

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

çalıştı Ama gelmiş

ben yazdım testi şudur Her iki durumda da MockContext'in startService yöntemimi çağırıyor. Bu yöntemin engellenmesi için bir yol var mı? Bu temel testleri gerçekleştirmek için temel Android API'lerini sarmalamaya gerek kalmayacaktım ...

+0

Eğer senin 'Activity' en' onCreate() 'yöntemi enstrümantasyon yoluyla adlandırılan oluyor doğruladınız mı? Orada yaptığın şeyle ilgili yanlış bir şey göremiyorum. –

+0

Şimdi, bu ilginç. Öyle değil. Açıkça getIstrumentation(). CallActivityOnCreate (...) yapsam da denmez. Ama ben * mock içeriğimi açıklarsam * diye adlandırılır * çağrının içinden geçmek için bir şeyler veya başka şeyler yapmak bağlamında bir bağımlılık olmalı. – Jules

+0

Yup. Bunu bulduk (http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-2/), bir göz atın. Esasen, MockContext 'neredeyse tamamen işe yaramaz :). –

cevap

6

Sadece yorumlarda Brian Dupuis ile yapılan görüşmeyi özetlemek gerekirse, sorun MockContext'un onCreate()'u doğru bir şekilde aramak için test enstrümantasyonu tarafından gereklidir. MockContext'dan ContextWrapper'a geçiş bu sorunu çözdü.

çalışma testi bu nedenle şuna benzer:

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

ActivityTestCase ve MockContext'in kullanımdan kaldırılmasıyla, orijinal çözümün bir alternatifi var mı? Teşekkürler! –