2012-02-15 38 views
9

Cố gắng viết ứng dụng Android-by-TDD đầu tiên của tôi (tôi đã viết một vài ứng dụng Android nhỏ mà không có TDD, vì vậy quen thuộc với môi trường), nhưng dường như tôi không thể hiểu được cách viết đầu tiên kiểm tra.Kiểm tra đơn vị Activity.startService() gọi?

Kịch bản:

Tôi có một hoạt động, TasksActivity và một dịch vụ, TasksService. Tôi cần kiểm tra rằng TasksActivity khởi động TasksService trong phương thức onStart() của nó.

Các thử nghiệm tôi đã viết là:

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()); 
}   
} 

Trong phương pháp onCreate() của tôi trong TasksActivity tôi có:

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

Tôi cũng đã cố gắng

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

Nhưng trong cả hai trường hợp, phương thức startService của MockContext đều không được gọi. Có cách nào tôi có thể thiết lập việc đánh chặn phương pháp này không? Tôi thực sự không phải bắt đầu gói các API Android cơ bản để thực hiện các kiểm tra cơ bản như vậy ...

+0

Bạn đã xác minh rằng bạn 'Activity' của' onCreate() 'phương pháp được gọi là việc thông qua các thiết bị đo đạc? Tôi không thấy bất cứ điều gì nhất thiết phải sai với những gì bạn đang làm ở đó. –

+0

Bây giờ, điều đó thật thú vị. Nó không phải là. Nó cũng không được gọi nếu tôi làm một cách rõ ràng getInstrumentation(). CallActivityOnCreate (...). Nhưng nó * được gọi là nếu tôi bình luận ra bối cảnh giả lập của tôi ... phải có một số phụ thuộc vào bối cảnh làm một cái gì đó hoặc khác để vượt qua cuộc gọi thông qua. – Jules

+0

Yup. Tìm thấy điều này (http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-2/), hãy xem. Về cơ bản, 'MockContext' gần như hoàn toàn vô dụng :). –

Trả lời

6

Chỉ để tóm tắt cuộc trò chuyện với Brian Dupuis trong nhận xét, vấn đề là MockContext không cung cấp các cơ sở được yêu cầu bởi thiết bị đo kiểm để gọi chính xác onCreate(). Chuyển từ MockContext sang ContextWrapper giải quyết được sự cố này. do đó

Các thử nghiệm làm việc trông như thế này:

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

Với việc ngừng sử dụng ActivityTestCase và MockContext, bạn có giải pháp thay thế cho giải pháp gốc không? Cảm ơn! –