2012-02-15 2 views
9

私の最初のAndroid-by-TDDアプリを書こうとしています(私はTDDのない小さなAndroidアプリをいくつか書いていますので、環境に精通しています)。テスト。ユニットテストActivity.startService()コール?

シナリオ:

私は活動、TasksActivity、およびサービス、TasksServiceを持っています。 TasksActivityがonStart()メソッドでTasksServiceを開始することをテストする必要があります。

私が書いたテストはこれです:TasksActivityの私のonCreate()メソッドで

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

私が持っている:

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

私も

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

を試してみました。しかしいずれの場合も、私のMockContextのstartServiceメソッドが呼び出されません。この方法の傍受を設定する方法はありますか?このような基本的なテストを実行するために、基本的なAndroid APIをラップして始める必要はありません。

+0

はあなた 'Activity'の'のonCreate() 'メソッドは計装を通して呼び出さなっていることを確認しましたか?私はあなたがそこでやっていることに必ずしも間違っていることは何も見ません。 –

+0

今、それは面白いです。そうではありません。私が明示的にgetInstrumentation()。callActivityOnCreate(...)を実行しても呼び出されません。しかし、私は私のモックコンテキストをコメントアウトすると呼び出されます。コールを通すためには、何か他のことをするコンテキストに依存する必要があります。 – Jules

+0

これを見つけました(http://www.paulbutcher.com/2011/03/mock-objects-on-android-with-borachio-part-2/)、見てください。基本的に、 'MockContext'はほとんど役に立たない:)。 –

答えて

6

Brian Dupuisとの会話をコメントにまとめると、問題はMockContextonCreate()を正しく呼び出すためには、テスト計装が必要です。 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

ActivityTestCaseとMockContextの使用が推奨されていないため、元のソリューションに代わるものがありますか?ありがとう! –