Модульное тестирование с имитацией FusedLocationProviderClient и внедрением зависимостей с помощью KoinAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Модульное тестирование с имитацией FusedLocationProviderClient и внедрением зависимостей с помощью Koin

Сообщение Anonymous »

В нашем приложении для Android мы используем API Google Maps, чтобы показывать местоположение пользователей. На данный момент мы используем Koin, чтобы обеспечить параметризованное внедрение (для этого требуется действие) зависимости FusedLocationProviderClient в наш класс Fragment. Теоретически это должно сделать тестирование и издевательство над классом Client (с помощью макета) более простым. Однако при попытках запустить тесты с помощью Android FragmentScenario оказывается, что тест где-то зависает в бесконечном цикле (при этом отладка не дает ответа на вопрос, почему).
Есть ли у кого-нибудь дополнительные идеи о том, как протестировать это вместе с фреймворками, которые мы используем. Документация Android/Google не предлагает никакой помощи, равно как и многочисленные часы работы в Интернете.

Мы попытались протестировать с внедрением FusedLocationProvideClient и без него. Мы попытались запустить тестовый модуль Koin в нашем тестовом классе, с параметрами активности и без нее, но, похоже, ничего не изменилось. FusedLocationProviderClient имитируется с расслабленным значением true.

Тестовый класс:

Код: Выделить всё

private val viewModel = mockk(relaxed = true)
private val locationClient = mockk(relaxed = true)

override var testModule = module {
viewModel { viewModel }
factory { locationClient }
}

@Test
fun itShouldDoSomethingWithLocation() {
val scenario = FragmentScenario.launchInContainer(LocationSelectionDialogFragment::class.java)
scenario.moveToState(Lifecycle.State.RESUMED)
scenario.onFragment {
val location = Location("this")
location.latitude = 37.422
location.longitude = -122.084
location.accuracy = 3.0f

locationClient.setMockMode(true)
locationClient.setMockLocation(location)
verify { viewModel.onDisplayed() }
}
}
Класс фрагмента:

Код: Выделить всё

class LocationSelectionDialogFragment: AbstractBottomSheetFragment(), KoinComponent, TestSupportDatabindingInterface, OnMapReadyCallback {

private lateinit var _dataBinding: ViewDataBinding
override fun dataBinding(): ViewDataBinding? = _dataBinding

private val viewModel: LocationSelectionViewModel by viewModel()

//Ma Objects n Variables
private val LOCATION_PERMISSION = 42

private lateinit var map: GoogleMap
private var mapView: MapView? = null

private val fusedLocationClient: FusedLocationProviderClient by inject { parametersOf(activity!!) }
private lateinit var locationCallback: LocationCallback
Застрял в бесконечном цикле

Подробнее здесь: https://stackoverflow.com/questions/570 ... y-injectio
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»