Тест, если кнопка запускает новую активность в андроиде junit (pref без robotium)?

Я не могу найти хорошую помощь в этом. У меня простая деятельность с помощью всего лишь нескольких кнопок, и мне нужно проверить, будут ли они перенаправляться на новую новую страницу (активность).

public void testButton() {
         button.requestFocus();
         button.performClick();

      }

Я действительно понятия не имею. В этом учебнике все очень бесполезно:/

Ответы

Ответ 1

Вам нужно ActivityMonitor, это поможет вам вновь открыть активность во время инструментария, посмотрите ниже псевдо-код:

public void testOpenNextActivity() {
  // register next activity that need to be monitored.
  ActivityMonitor activityMonitor = getInstrumentation().addMonitor(NextActivity.class.getName(), null, false);

  // open current activity.
  MyActivity myActivity = getActivity();
  final Button button = (Button) myActivity.findViewById(com.company.R.id.open_next_activity);
  myActivity.runOnUiThread(new Runnable() {
    @Override
    public void run() {
      // click button and open next activity.
      button.performClick();
    }
  });

  //Watch for the timeout
  //example values 5000 if in ms, or 5 if it in seconds.
  NextActivity nextActivity = getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 5000);
  // next activity is opened and captured.
  assertNotNull(nextActivity);
  nextActivity .finish();
}

Ответ 2

NextActivity nextActivity = getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 5);

Параметр 5, который упоминается в приведенном выше методе ответа, находится в миллисекундах не в секундах. Так что, если это 5, иногда тестовый тест выходит из строя, потому что через 5 миллисекунд он не может загрузить следующее действие. Таким образом, 5000 или 10000 миллисекунд, безусловно, будут работать лучше. В документации они дали его за считанные секунды. Но на самом деле это в миллисекундах. Поэтому следующий метод будет работать лучше, чем описанный выше метод.

NextActivity nextActivity = getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 10000);

Ответ 3

Для теста ActivityUnitTestCase вы можете использовать getStartedActivityIntent(), чтобы проверить намерение, которое было передано вызову startActivity().

protected Intent waitForStartedActivityIntent(int timeout) {
    long endTime = SystemClock.uptimeMillis() + timeout;
    while (SystemClock.uptimeMillis() <= endTime) {
        Intent intent = getStartedActivityIntent();
        if (intent != null) {
            return intent;
        }
    }
    return null;
}

Кредит: waitFor... логика была вдохновлена ​​этим ответом

Примечание: при ActivityUnitTestCase активность фактически не запускается; вызов вымывается макетным родительским набором в тестовом случае.

Ответ 4

Вы можете использовать ActivityMonitor или Instrumentation, чтобы узнать, как запускается целевая активность или не нравится ниже

public void testButton() {
     Instrumentation.ActivityMonitor activityMonitor = getInstrumentation()
            .addMonitor(TargetActivity.class.getName(), null, false);
    //button.performClick(); // Dont use this method
    TouchUtils.clickView(this, button);
    TargetActivity targetActivity = (TargetActivity) activityMonitor.waitForActivity(); // By using ActivityMonitor
    // TargetActivity targetActivity = (TargetActivity) activityMonitor.waitForActivityWithTimeout(5);// It also works
    // TargetActivity targetActivity = (TargetActivity) getInstrumentation().waitForMonitor(activityMonitor); // By using Instrumentation
   // TargetActivity targetActivity = (TargetActivity) getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 5); // It also works
    assertNotNull("Target Activity is not launched", targetActivity);
  }