Модульный тест Android

#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, чтобы проверить, удалось ли соединение, наконец, успешно, похоже, подходит, если вы не хотите ждать слишком долго. Просто сделайте несколько попыток перед выходом.