为什么在自定义测试后调用testServiceTestCaseSetupProperly(...)?

时间:2012-07-16 04:51:28

标签: android unit-testing service junit servicetestcase

我有简单的ServiceTestCase和一个只包含生命周期方法的空IntentSerice,Service也注册了AndroidManifest.xml,还有一个Action标签“com.tut.my.service.DATAUPDATE”。

服务的调用工作得很好,所有的实时循环方法都按顺序出现,但是在我的自定义测试结束后发生了一些奇怪的事情。 ServiceTestCase在我的自定义测试后发出方法testServiceTestCaseSetUpProperly(),以确保setupService()正确运行。

所以我正在寻找arround并找到一些interesting blog关注setupService(),但结论并不满足。博客作者建议 - 出于某种充分的理由 - 不要在startService(...)中致电setUp(),因为他非常清楚为什么这不是一个好主意。

但是,在我的自定义测试之后调用testServiceTestCaseSetUpProperly()引起的问题是调用MyService服务的新实例。这最终会调用onCreate而不是 服务因某种原因而死亡,但是所有测试都成功通过。

以下是服务的来源:

public class MyService extends IntentService {

  public static final String INTENT = "com.tut.my.service.DATAUPDATE";

  public MyService() {
    super(INTENT);
    Log.d(getClass().getSimpleName(), "called: std c-tor()");
  }

  @Override
  public void onCreate() {
    super.onCreate();
    Log.d(getClass().getSimpleName(), "called: onCreate()");
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    Log.d(getClass().getSimpleName(), "called onStartCommand() --> intent: " + intent.getAction() + " flags: " + flags + " startID: " + startId);
    return super.onStartCommand(intent, flags, startId);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    Log.d(getClass().getSimpleName(),"called: onDestory()");
  }

  @Override
  protected void onHandleIntent(Intent intent) {
    Log.d(getClass().getSimpleName(), "called: onHandleIntent() --> Intent: " + intent.getAction());
    setPriceData();
  }
}

以下是ServiceTestCase的来源

@MediumTest
public class MyServiceTest extends ServiceTestCase<MyService> {

  Context mCtx = null;

  public MyServiceTest() {
    super(MyService.class);
  }

  @Override
  protected void setUp() throws Exception {
    super.setUp();
    mCtx = getSystemContext();
  }

  @MediumTest
  public void testGetMyServiceData() throws InterruptedException {
    Intent i = new Intent(MyService.INTENT);
    Log.d(getClass().getSimpleName(), "startService(i)");
    mCtx.startService(i);

    // throttle the instrumentation thread so the service 
    // can be instantiated for sure
    Log.d(getClass().getSimpleName(), "before Thread Sleep");
    Thread.sleep(8000); // needs 10 seconds before ANR
    Log.d(getClass().getSimpleName(), "after Thread Sleep");
  }
}

相应的(剥离的)LogCat输出:

I/TestRunner(11954): started: testGetMyServiceData(com.tut.my.service.MyServiceTest)
D/MyServiceTest(11954): startService(i)    
D/MyService(11954): called: std c-tor()
D/MyServiceTest(11954): before Thread Sleep
D/MyService(11954): called: onCreate()
D/MyService(11954): called onStartCommand() --> intent: com.tut.my.service.DATAUPDATE flags: 0 startID: 1
D/MyService(11954): called: onHandleIntent() --> Intent: com.tut.my.service.DATAUPDATE
D/MyService(11954): called: onDestory()
D/MyServiceTest(11954): after Thread Sleep
I/TestRunner(11954): finished: testGetMyServiceData(com.tut.my.service.MyServiceTest)
I/TestRunner(11954): passed: testGetHarvestData(com.tut.my.service.MyServiceTest)
I/TestRunner(11954): started: testServiceTestCaseSetUpProperly(com.tut.my.service.MyServiceTest)
D/MyService(11954): called: std c-tor()
I/TestRunner(11954): finished: testServiceTestCaseSetUpProperly(com.tut.my.service.MyServiceTest)
I/TestRunner(11954): passed: testServiceTestCaseSetUpProperly(com.tut.my.service.MyServiceTest)
I/TestRunner(11954): started: testAndroidTestCaseSetupProperly(com.tut.my.service.MyServiceTest)
I/TestRunner(11954): finished: testAndroidTestCaseSetupProperly(com.tut.my.service.MyServiceTest)
I/TestRunner(11954): passed: testAndroidTestCaseSetupProperly(com.tut.my.service.MyServiceTest)
I/ActivityManager(71): Force stopping package com.tut.my.service uid=10036
I/Process(71): Sending signal. PID: 11954 SIG: 9

所以问题是,为什么在最后调用testServiceTestCaseSetupProperly()而不是在第一个位置?为什么MyService对象死得太厉害了。

编辑:为了更加精确:

我担心的重要部分是对onCreate的粗鲁呼吁。

 I/TestRunner(11954): started: testServiceTestCaseSetUpProperly(com.tut.my.service.MyServiceTest)
 D/MyService(11954): called: std c-tor() <--- ONLY one call to onCreate
 I/TestRunner(11954): finished:testServiceTestCaseSetUpProperly(com.tut.my.service.MyServiceTest)
  • 如果我要在onCreate中分配资源,谁断言我要清理已分配的资源?
  • 为什么在所有测试结束时检查正确的服务设置?
  • 为什么它会被杀?

1 个答案:

答案 0 :(得分:2)

JUnit 3使用反射来获取要运行的测试。无法保证测试以任何特定顺序运行。 此外,单元测试应该彼此独立,因此它们的执行顺序不应该相关。