Как я могу написать модульный тест Android, который зависит от обновлений местоположения? - PullRequest
1 голос
/ 24 мая 2011

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

Я создал провайдер фиктивного местоположения.Когда я втыкаю провайдера-макета в свое приложение, я вижу ожидаемый квадрат сетки Maidenhead на дисплее.Когда я вставляю фиктивный провайдер в свой тестовый проект и проверяю представление, которое он никогда не обновляет, даже когда я вызываю Thread.sleep () или waitOnIdleSync ().

, я бы непосредственно тестировал метод, который вычисляет фактический квадрат сеткино это приватно, и нет способа проверить приватные методы.Весь пример кода, который я видел в Интернете для модульных тестов, которые проверяют представления, относится к приложениям, таким как калькуляторы, где активность запускается нажатием ложной кнопки.

Вот код для теста:

    public void testMaidenhead() {
        // this is a single test which doesn't really validate the algorithm
        // identifying a bunch of edge cases would do that
        publishMockLocation();
        final String expectedMH = "CM87wk";
        // TODO: checking the textview does not work
        TextView mhValueView = (TextView) mActivity.findViewById(org.twilley.android.hfbeacon.R.id.maidenheadValue);
        String actualMH = mhValueView.getText().toString();
        // final String actualMH = mActivity.gridSquare(mLocation);
        assertEquals(expectedMH, actualMH);
    }

А вот код для публикации макета местоположения:

    protected void publishMockLocation() {
        final double TEST_LONGITUDE = -122.084095;
        final double TEST_LATITUDE = 37.422006;
        final String TEST_PROVIDER = "test";
        final Location mLocation;
        final LocationManager mLocationManager;

        mLocationManager = (LocationManager) mActivity.getSystemService(Context.LOCATION_SERVICE);
        if (mLocationManager.getProvider(TEST_PROVIDER) != null) {
            mLocationManager.removeTestProvider(TEST_PROVIDER);
        }
        if (mLocationManager.getProvider(TEST_PROVIDER) == null) {
            mLocationManager.addTestProvider(TEST_PROVIDER, 
                false, //requiresNetwork,
                false, // requiresSatellite,
                false, // requiresCell,
                false, // hasMonetaryCost,
                false, // supportsAltitude,
                false, // supportsSpeed,
                false, // supportsBearing,
                android.location.Criteria.POWER_MEDIUM, // powerRequirement
                android.location.Criteria.ACCURACY_FINE); // accuracy
        }
        mLocation = new Location(TEST_PROVIDER);
        mLocation.setLatitude(TEST_LATITUDE);
        mLocation.setLongitude(TEST_LONGITUDE);
        mLocation.setTime(System.currentTimeMillis());
        mLocation.setAccuracy(25);
        mLocationManager.setTestProviderEnabled(TEST_PROVIDER, true);
        mLocationManager.setTestProviderStatus(TEST_PROVIDER, LocationProvider.AVAILABLE, null, System.currentTimeMillis());
        mLocationManager.setTestProviderLocation(TEST_PROVIDER, mLocation);
    }

Любая помощь будет принята с благодарностью.Заранее спасибо!

Джек.

1 Ответ

1 голос
/ 02 марта 2012

Модульное тестирование не будет означать, что ваш телефон подделывает свое местоположение GPS, поэтому он показывает вам девичью голову для местоположения, которое вы хотите проверить. Модульное тестирование будет следующим: написать функцию, которая будет принимать GPS-координаты WGS84 и выводить Maidenhead, и написать пару тестов для серии входных и выходных позиций, чтобы убедиться, что ваша функция работает так, как вам нужно.

Тестирование фактической активности Android будет интеграционным или приемочным тестированием, но фактическая координата функциональности Maidenhead должна работать, когда вы ее тестировали.

...