Intereting Posts
Любой способ поддержать samsung galaxy s4 с использованием совместимых размеров экрана Объект пользовательского интерфейса, созданный с помощью XML, не обрабатывается в Android Marshmallow Кнопка Android Action Вверх и кнопка Назад Spotify API: INVALID_APP_ID Прочитать содержимое URL-адреса в Android Статическая переменная Java становится нулевой Блокировка будильника AlarmManager при запуске службы Не удается разрешить символ при изменении версии библиотеки поддержки Более эффективный метод рисования тысяч частиц (Java / Android) Как я могу изменить язык моего приложения Пожертвования PayPal в приложениях для Android Повторно открыть фоновое приложение через элемент уведомлений Запрос и разрешение WRITE_EXTERNAL_STORAGE во время выполнения не влияет на текущий сеанс Широковещательный приемник с sendMultiPartTextMessage Покупки в приложениях: доля пользователей в покупках In-App между Android и iOS

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

Я пытаюсь интегрировать единичные тестовые примеры для каждого фрагмента кода. Но я сталкиваюсь с проблемами при добавлении тестовых примеров для вызовов 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(); } } }