Android: как сделать провал модульного теста - PullRequest
0 голосов
/ 06 мая 2011

Я тестирую последовательность уничтожения / перезапуска, чтобы убедиться, что счетчик сохраняет свое первоначальное значение (до того, как он был неправильно увеличен при перезапуске). Я вставил исправление, и оно работало, когда я тестировал вручную. Но юнит-тестирование всегда проходит, включаю ли я исправление или нет. Как вы можете видеть из кода ниже, я получаю значение счетчика, затем перезагружаюсь, снова получаю значение счетчика и сравниваю их. В чем может быть проблема?

public void testNumCorrectEqualAfterDestroy() {

mCorrect = (TextView) mActivity.findViewById(R.id.correct);

    int before = Integer.parseInt(mCorrect.getText().toString());
    mActivity.finish();
    mActivity = this.getActivity();

mCorrect = (TextView) mActivity.findViewById(R.id.correct);

    int after = Integer.parseInt(mCorrect.getText().toString());

    Assert.assertEquals(before, after);

  } 

Ответы [ 2 ]

1 голос
/ 06 мая 2011

Я думаю, что finish () не будет циклически повторять вашу активность через «соответствующие» состояния.То, как я тестировал этот случай жизненного цикла, выглядит так:

...
//TODO: do not use getActivity, instead use the startActivity() method 
//and pass a value in the Bundle parameter 
...
getInstrumentation().callActivityOnStart(mActivity);
getInstrumentation().callActivityOnResume(mActivity);
//TODO: asssert that the value is the expected one (based on what you fed in the bundle)
Bundle newBundle = new Bundle();
getInstrumentation().callActivityOnSaveInstanceState(mActivity, newBundle);
getInstrumentation().callActivityOnPause(mActivity);
getInstrumentation().callActivityOnStop(mActivity);
getInstrumentation().callActivityOnDestroy(mActivity);

//initialize activity with the saved bundle
getInstrumentation().callActivityOnCreate(mActivity, newBundle); 
getInstrumentation().callActivityOnResume(mActivity);

//TODO: assert that the value is the expected one
0 голосов
/ 24 февраля 2012

ActivityInstrumentationTestCase2.getActivity() запускает Activity при первом вызове, а затем просто возвращает Activity при каждом последующем вызове в тестовом примере.Таким образом, вы все еще смотрите на действие, которое вы завершили.

После того, как вы закончите первое действие, вам нужно начать новое с теста.Вы можете использовать InstrumentationTestCase.launchActivity(), например.

В качестве другого примера я написал тест, который нажимает кнопку в ActivityA, которая запускает ActivityB for-result;Затем тест немедленно убивает ActivityA (с помощью изменения ориентации, но будет работать и finish ()), а затем тест получает указатель на новый ActivityA, который система создает при выполнении ActivityB, и отправляет свой результат.Хитрость заключалась в том, чтобы тест добавлял Instrumentation.ActivityMonitor, а затем заставлял этот монитор ждать, пока система запустит новый ActivityA, и даст тесту указатель.

...