Почему testServiceTestCaseSetupProperly(...) называется ПОСЛЕ пользовательских тестов?

У меня есть простой ServiceTestCase и пустой IntentSerice, содержащий только методы жизненного цикла, служба также зарегистрирована в AndroidManifest.xml, а также тег действия "com.tut.my.service.DATAUPDATE".

Вызов Service работает довольно хорошо, все методы жизненного цикла отображаются по порядку, но что-то странное происходит после завершения моего пользовательского теста. ServiceTestCase выпустил метод testServiceTestCaseSetUpProperly() ПОСЛЕ моего пользовательского теста, чтобы убедиться, что setupService() работает правильно.

Поэтому я осматриваюсь и нахожу интересный блог, касающийся 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 ответ

Решение

JUnit 3 использует отражение для получения тестов для запуска. Не гарантируется, что тесты выполняются в каком-либо определенном порядке. Кроме того, модульные тесты должны быть независимы друг от друга, поэтому их порядок выполнения не должен быть релевантным.

Другие вопросы по тегам