#android #unit-testing #wait
#Android #модульное тестирование #подождите
Вопрос:
Во время тестирования приложения для Android с помощью платформы тестирования Android, как мне заставить тест ждать, пока я жду ответа сети, прежде чем продолжить. Я не хочу использовать Thread.sleep, поскольку не уверен, как долго я хочу ждать. Также пробовал waitForIdleSync(), но, похоже, он не работает. Есть ли другой способ?
У меня есть метод enterCredentials, который вводит имя пользователя и пароль и нажимает кнопку входа в систему. Мне нужно подождать некоторое время, прежде чем он получит объект user и сохранит его в базе данных, прежде чем я получу объект user для проверки учетных данных. Я хочу альтернативу Thread.sleep() здесь. Я уже пробовал waitForIdleSync(), но это, похоже, не работает.
@Override
protected void setUp() throws Exception {
super.setUp();
mActivity = getActivity();
enterCredentials();
Thread.sleep(2000);
testLoggedInUser();
}
public void testLoggedInUser() {
mMyApplication = this.getInstrumentation().getTargetContext().getApplicationContext();
User user = mMyApplication.getUser();
String email = user.getEmail();
assertEquals(EMAIL, email);
}
public void enterCredentials() {
final EditText mUsername = (EditText) mActivity.findViewById(R.id.email);
final EditText mPassword = (EditText) mActivity.findViewById(R.id.password);
final Button login = (Button) mActivity.findViewById(R.id.logIn);
mActivity.runOnUiThread(new Runnable() {
public void run() {
mUsername.setText(EMAIL);
mPassword.setText(PASSWORD);
login.performClick();
}
});
}
Комментарии:
1. ..что?? Пожалуйста, уточните свой вопрос, поскольку я не могу понять, в чем заключается ваш вопрос..
2. какой тест вы выполняете?, за исключением тестов на принятие / интеграцию, ваш тест должен быть быстрым и независимым, вы должны имитировать / шпионить / … ваши границы, особенно сетевой запрос
3. Я пытаюсь протестировать функцию входа в мое приложение, где я ввожу учетные данные и отправляю post-запрос, а сервер возвращает мне пользовательский объект. Поэтому во время тестирования я хочу дождаться получения этого пользовательского объекта, а затем я смогу проверить учетные данные пользователя. Итак, как мне заставить тест подождать в этом случае?
4. Пожалуйста, также покажите какой-нибудь код, который вы уже пробовали.
5. Может кто-нибудь, пожалуйста, снять удержание сейчас.
Ответ №1:
Вы можете запускать два потока внутри одного большого потока. Один поток будет ждать синхронизации соединения. Вы можете превратить это в оператор if или что-то еще и иметь контроль времени, который будет вызывать другой поток только в случае успешной синхронизации. Если достигнут срок, в течение которого вы не хотите запускать тест, вы можете выйти из приложения или сделать все, что захотите. Таким образом, вы фактически избежите использования Thread.sleep(), а также будете иметь некоторый контроль времени.
Но Thread.sleep() с небольшими интервалами и оператором if, чтобы проверить, удалось ли соединение, наконец, успешно, похоже, подходит, если вы не хотите ждать слишком долго. Просто сделайте несколько попыток перед выходом.