Intereting Posts
Активность просочилась в окно com.android.internal.policy.impl.PhoneWindow$DecorView@44f72ff0, которое было первоначально добавлено здесь Как автоматически импортировать необходимые классы в Android Studio с помощью ярлыка? Сбой процесса во время создания инжектора RoboGuice, если в любом модуле есть посмеянный экземпляр Как дублировать проект SDK-образца в рабочее пространство? Вертикальная (повернутая) этикетка в Android Android: Как автоматически перезапустить приложение после того, как оно было «принудительно закрыто»? Содержимое проигрывателя, потерянного при вращении Android.content.res.Resources $ NotFoundException: Не удается найти идентификатор ресурса # 0xffffffff Проблема при использовании отпечатка пальца Android: IV требуется при расшифровке. Используйте IvParameterSpec или AlgorithmParameters для его предоставления. Ошибка Looping на Android-эмуляторе Увеличение двойного крана WebView не работает на Motorola Droid A855 Ошибка: причина: com.android.sdklib.repository.FullRevision Как добавить onclicklistener в динамически сгенерированное текстовое представление? Тестирование устройств Android в Eclipse: «Не удалось запустить тест» Сбой в действиях с помощью SharedElement

Как тестировать модуль

Я пытаюсь интегрировать единичные тестовые примеры для каждого фрагмента кода. Но я сталкиваюсь с проблемами при добавлении тестовых примеров для вызовов api, которые выполняются с помощью модификации.

Компилятор JUnit никогда не выполняет код в функциях CallBack .

Существует еще один способ сделать все вызовы api синхронными для целей тестирования, но это невозможно для каждого случая в моем приложении.

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

Любое предложение для другого подхода также будет полезно.

Заранее спасибо!

Solutions Collecting From Web of "Как тестировать модуль"

Я тестирую свои обратные вызовы с помощью Mockito, Robolectric и Hamcrest.

Прежде всего, настройте стек lib в файле build.gradle вашего модуля:

dependencies { testCompile 'org.robolectric:robolectric:3.0' testCompile "org.mockito:mockito-core:1.10.19" androidTestCompile 'org.hamcrest:hamcrest-library:1.1' } 

В глобальном build.gradle jour project добавьте следующую строку к зависимостям buildscript:

 classpath 'org.robolectric:robolectric-gradle-plugin:1.0.1' 

Затем запустите меню «Build Variants» в Android Studio (чтобы быстро найти его, нажмите Ctrl + Shift + A и найдите его) и переключите опцию «Test Artifact» в «Unit Tests». Студия Android переключит вашу тестовую папку на «com.your.package (test)» (вместо androidTest).

ОК. Настройка сделана, время, чтобы написать несколько тестов!

Допустим, у вас есть несколько ави-рифов для восстановления списка объектов, которые нужно поместить в какой-либо адаптер для RecyclerView и т. Д. Мы хотели бы проверить, заполняется ли адаптер надлежащими элементами при успешном вызове. Для этого нам нужно будет переключить реализацию интерфейса Retrofit, которую вы используете для совершения звонков с макетом, и выполните некоторые поддельные ответы, используя класс Mockito ArgumentCaptor.

 @Config(constants = BuildConfig.class, sdk = 21, manifest = "app/src/main/AndroidManifest.xml") @RunWith(RobolectricGradleTestRunner.class) public class RetrofitCallTest { private MainActivity mainActivity; @Mock private RetrofitApi mockRetrofitApiImpl; @Captor private ArgumentCaptor<Callback<List<YourObject>>> callbackArgumentCaptor; @Before public void setUp() { MockitoAnnotations.initMocks(this); ActivityController<MainActivity> controller = Robolectric.buildActivity(MainActivity.class); mainActivity = controller.get(); // then we need to swap the retrofit api impl. with a mock one // I usually store my retrofit api impl as a static singleton in class RestClient, hence: RestClient.setApi(mockRetrofitApiImpl); controller.create(); } @Test public void shouldFillAdapter() throws Exception { Mockito.verify(mockRetrofitApiImpl) .getYourObject(callbackAgrumentCaptor.capture()); int objectsQuantity = 10; List<YourObject> list = new ArrayList<YourObject>; for(int i = 0; i < objectsQuantity; ++i) { list.add(new YourObject()); } callbackArgumentCaptor.getValue().success(list, null); YourAdapter yourAdapter = mainActivity.getAdapter(); // obtain adapter // simple test check if adapter has as many items as put into response assertThat(yourAdapter.getItemCount(), equalTo(objectsQuantity)); } } 

Выполните тест, щелкнув правой кнопкой мыши класс тестирования и пропустив его.

Вот и все. Я настоятельно рекомендую использовать Robolectric (с плагином robolectric gradle) и Mockito, эти библиотеки упрощают тестирование приложений Android в целом. Я узнал этот метод из следующего сообщения в блоге . Также обратитесь к этому ответу .

Обновление : если вы используете Retrofit с RxJava, проверьте мой другой ответ на это .

Если вы используете .execute () вместо .enqueue (), он выполняет синхронизацию выполнения, поэтому тесты могут выполняться правильно, без необходимости импортировать 3 разные библиотеки и добавлять какой-либо код или изменять варианты сборки.

Подобно:

 public class LoginAPITest { @Test public void login_Success() { APIEndpoints apiEndpoints = RetrofitHelper.getTesterInstance().create(APIEndpoints.class); Call<AuthResponse> call = apiEndpoints.postLogin(); try { //Magic is here at .execute() instead of .enqueue() Response<AuthResponse> response = call.execute(); AuthResponse authResponse = response.body(); assertTrue(response.isSuccessful() && authResponse.getBearer().startsWith("TestBearer")); } catch (IOException e) { e.printStackTrace(); } } }