0

在我的 Android 项目中,我有一个Activity

public MyActivity extends Activity{
    ...
    @Override
    protected void onStart() {
    super.onStart();
        Intent intent = new Intent(this, MyService.class)
        startService(intent);
    }
}

onStart()MyActivity我才刚刚开始MyService

我的简单服务仅用于收听电话状态变化

public MyService extends Service{
  @Override
  public int onStartCommand(Intent intent, int arg, int id) {
       super.onStartCommand(intent, arg, id);
       /*register a PhoneStateListener to TelephonyManager*/
       startToListenToPhoneState();// show Toast message for phone state change
       return START_STICKY;
  }
}

一切正常,启动我的应用程序后,当我打电话时,我的服务正在监听电话状态变化并显示 toast 消息。

接下来,我决定对我的项目进行单元测试,所以我AndroidTestCase在我的测试项目中创建了一个:

public class MySimpleTest extends AndroidTestCase{
   ...
   @Override
   protected void runTest() {
      //make a phone call
      String url = "tel:3333";
      Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(url));
      mContext.startActivity(mIntent);
   }
}

上面的测试用例只是简单地开始一个电话,它也可以正常工作。

我按下 HOME 按钮将我的应用程序置于后台,之后,我运行测试用例以开始通话,我希望PhoneStateListener我的服务中的服务仍会运行以向我显示 Toast 消息,但它没有.

然后我发现我也必须在我的测试用例中启动绑定 MyService,之后我可以在运行我的测试用例时看到来自 PhoneStateListener 的 toast 消息,这是为什么呢?我的意思是为什么我的服务在我的应用程序的后台运行,但我仍然必须在测试用例中启动或绑定服务才能触发MyService运行时定义的 PhoneStateLister AndroidTestCase

4

1 回答 1

0

在 Android ServiceTestCase 文档中,它说,

测试用例等待调用 onCreate(),直到您的测试方法之一调用 startService(Intent) 或 bindService(Intent)。这使您有机会在测试正在运行的服务之前设置或调整任何其他框架或测试逻辑。

我认为 AndroidTestCase 提供了一个框架,您可以在受控环境中测试您的活动、服务等,因此您至少应该在测试与服务交互之前启动您的服务。

参考:http: //developer.android.com/reference/android/test/ServiceTestCase.html

于 2013-10-10T15:22:38.647 回答