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

1

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

Я создал провайдера определения местоположения. Когда я прикрепляю поставщика макета к моему приложению, я вижу ожидаемый квадрат сетки 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);
    }

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

Джек.

Теги:
unit-testing
location
gps

1 ответ

1
Лучший ответ

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню