проверка того, что действие называется setResult - PullRequest
16 голосов
/ 12 ноября 2010

Я пишу тесты для активности (мой тестовый класс расширяет ActivityInstrumentationTestCase2), у меня есть несколько базовых тестов, которые написаны и работают нормально.

Однако мое действие, когда оно завершается, возвращает дополнительные данные в вызывающее действие через setResult (resultcode, Intent i). Что бы я хотел сделать, используя инструментарий, завершить мое действие, а затем проверить, что оно передало в вызове setResult.

Есть ли какой-нибудь фреймворк, предоставляющий способ сделать это? я пока не смог ничего найти, один из подходов состоял бы в том, чтобы создать подкласс класса активности и переопределить setResult, чтобы он запомнил и раскрыл то, что было передано в setResult (оказывается, setResult является окончательным, поэтому вы тоже не можете этого сделать) Кажется, должен быть лучший способ.

Ответы [ 3 ]

11 голосов
/ 24 января 2012

Как я уже ответил в другом задании, вы также можете использовать Robolectric и скрывать тестируемое действие. Затем ShadowActivity предоставляет вам методы, позволяющие легко узнать, завершается ли действие, и получить его код результата.

Например, один из моих тестов выглядит так:

@Test
public void testPressingFinishButtonFinishesActivity() {
    mActivity.onCreate(null);
    ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity);

    Button finishButton = (Button) mActivity.findViewById(R.id.finish_button);
    finishButton.performClick();

    assertEquals(DummyActivity.RESULT_CUSTOM, shadowActivity.getResultCode());
    assertTrue(shadowActivity.isFinishing());
}

Для Robolectric 3+ заменить

ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity);

с

ShadowActivity shadow = Shadows.shadowOf(activity);
6 голосов
/ 28 апреля 2011

Смотрите мой ответ на другой похожий вопрос:

Вы можете использовать отражение и получить значения непосредственно из Упражнения.

protected Intent assertFinishCalledWithResult(int resultCode) {
  assertThat(isFinishCalled(), is(true));
  try {
    Field f = Activity.class.getDeclaredField("mResultCode");
    f.setAccessible(true);
    int actualResultCode = (Integer)f.get(getActivity());
    assertThat(actualResultCode, is(resultCode));
    f = Activity.class.getDeclaredField("mResultData");
    f.setAccessible(true);
    return (Intent)f.get(getActivity());
  } catch (NoSuchFieldException e) {
    throw new RuntimeException("Looks like the Android Activity class has changed it's   private fields for mResultCode or mResultData.  Time to update the reflection code.", e);
  } catch (Exception e) {
    throw new RuntimeException(e);
  }
}
1 голос
/ 24 апреля 2011

Другим подходом было бы использование современных фреймворков, таких как jmockit, - таким образом вы можете моделировать поведение классов Android без эмулятора и т. Д. Пример этого можно увидеть в моих модульных тестах: https://github.com/ko5tik/jsonserializer (предыдущие версии работали противJSON в комплекте с android и актуален против GSON, но логика насмешки все еще есть)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...