Тест, если кнопка запускает новую активность в андроиде 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);
}