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

#android #unit-testing #gps #location

#Android #модульное тестирование #gps #Расположение

Вопрос:

У меня есть приложение, которое отображает квадрат сетки 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:

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

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

Комментарии:

1. Извините, что не добрался до этого раньше! Я уже написал тесты для проверки кода Maidenhead, используя различные точки на Земле, которые были проблематичными. Однако я неправильно понял разницу между этим тестированием и интеграционным или приемочным тестированием. Спасибо!