Android jUnit TestCase: когда на самом деле вызывается действие onCreate ()? - PullRequest
4 голосов
/ 22 ноября 2011

Я довольно новичок в тестировании и пытаюсь изучить jUnit Tests и Robotium.В моем приложении 4 экрана.

Splash Screen --> Screen2--> Screen 3--> Autocomplete Screen.
[init()]                               [ check values generated by init() method]

Экран автозаполнения - это когда пользователь что-то вводит, а приложение выполняет автозаполнение из большой базы данных Продуктов.На заставке я инициализирую множество переменных приложения, используя метод init() в другом классе.Этот метод init() загрузит настройки usedr, проверит создание базы данных и т. Д. (База данных продукта предварительно упакована в apk, и я копирую базу данных при первом запуске и помечаю ее в SharedPreferences как copied = true),

Проблема: Как изолировать тестирование экрана автозаполнения?OnCreate AutocompleteActivity зависит от вызова init () в SplashScreen.Я не уверен, когда jUnit создает экземпляр Activity, (, вероятно, в конструкторе? ).Вот мой TestCaseCode:

import android.test.ActivityInstrumentationTestCase2;
import android.view.View;
import android.widget.ListView;

import com.jayway.android.robotium.solo.Solo;
import com.supervalu.mobile.android.AutoCompleteActivity;
import com.supervalu.mobile.android.db.LocalDb;

public class AutocompleteTest extends
        ActivityInstrumentationTestCase2<AutoCompleteActivity> {
private Solo solo;

public AutocompleteTest() {
    super("com.****.*****.*****", AutoCompleteActivity.class);
}

protected void setUp() throws Exception {
    super.setUp();
    LocalDb.init(getActivity().getApplicationContext());
    solo = new Solo(getInstrumentation(), getActivity());

}

public void test1Character() {
    solo.sleep(2000);
    solo.enterText(0, "c");
    solo.sleep(10000);
View v = getActivity().findViewById(
            com.*****.****.*****.R.id.list);
    solo.waitForView(v);
    assertTrue(((ListView) v).getChildCount() > 0);


}

public void test3Character() {
    LocalDb.init(getActivity().getApplicationContext());
    solo.enterText(0, "che");
    View v = getActivity().findViewById(
            com.*****.****.*****.R.id.list);
    solo.waitForView(v);
    assertTrue(((ListView) v).getChildCount() > 0);
}

protected void tearDown() throws Exception {

    solo.finishOpenedActivities();
    super.tearDown();

}

Тестовый пример продолжает создаваться, потому что onCreate требует некоторых значений из LocalDb, которые должны были быть инициализированы методом init().

Я не могу добавитьФункция init () перед супер вызовом в конструкторе.Есть ли способ обойти это, или мне нужно запустить тестовый пример с заставки?

Проблема 2: Если я начинаю тестирование с заставки, мне нужно сначала перейти к экрану автозапуска, прежде чемспособен выполнять любые тесты на нем.Предположим, что я тоже это сделал, затем для каждого теста: test1character () класс выполняет setUp (), затем тест и затем tearDown (), затем перезапускает всю последовательность для функции test3characters ().Становится очень больно повторять переход к экрану автозаполнения каждый раз перед тем, как проверять вводимые данные.Есть предложения по этому поводу?

Я не уверен, какой подход выбрать.Может кто-нибудь, пожалуйста, направить меня?

Ответы [ 4 ]

3 голосов
/ 03 июня 2015

У меня была похожая проблема, и я смог ее исправить.В вашем методе setUp () бесполезно вызывать getActivity ().Это не влияет на ваши методы тестирования.Вы должны использовать:

getInstrumentation().getTargetContext()

, например, использовать

getInstrumentation().getTargetContext().getContentResolver()

вместо

getActivity().getContentResolver()

Надеюсь, это работает для вас!

CheersAntonino

0 голосов
/ 14 декабря 2011

Я не совсем понимаю вашу проблему, но постараюсь помочь.

Выполнить запуск действия (и вызовы его обратного вызова onCreate) можно с помощью:

getActivity();

Обычное место для этого - метод setUp() (вызывать перед каждым тестом).

Как вы говорите, для каждого теста вызываются методы setUp() и tearDown().

Я думаю, что лучший способ проверить навигацию вашего приложения - это простой тест, и создать все намерения, которые вам нужны, чтобы запустить все действия, встроенные в тест.

Надеюсь, это поможет.

0 голосов
/ 04 июня 2013

Если вы выполняете модульное тестирование, вы должны расширить свой тестовый класс до ActivityUnitTestCase, чтобы протестировать отдельное действие и использовать метод startActivity, который будет вызывать ваш onCreate.ActivityInstrumentationTestCase2 предназначен для функционального тестирования действия.

см. Дополнительную информацию в справочном документе Android ...

Запустите тестируемое действие так же, как если бы оно было запущено Context.startActivity (), предоставив аргументы, которые он предоставил.Когда вы используете этот метод для запуска действия, он будет автоматически остановлен tearDown ().

Этот метод вызовет onCreate (), но если вы хотите продолжить осуществлять методы жизненного цикла действия, вы должны вызвать ихсамостоятельно из вашего тестового примера.

Не вызывайте из вашего метода setUp ().Вы должны вызывать этот метод для каждого из ваших методов тестирования.

0 голосов
/ 22 ноября 2011

Я обнаружил, что моделирующая среда - лучшая альтернатива для выполнения тестов изолированного метода методы андроид деятельности. На данный момент jMockit является единственным фреймворком, способным эффективно моделировать базовые классы эндроидов.

Вы сможете отказаться от большого количества кода установки и удаления. Смотрите тестовый пример:

https://github.com/ko5tik/andject/blob/master/src/test/java/de/pribluda/android/andject/ViewInjectionTest.java

...