在我们的 Android 应用程序中,我们使用 Google Maps API 来显示用户位置。目前,我们正在使用 Koin 将 FusedLocationProviderClient 依赖项的参数化注入(它需要一个活动)提供到我们的 Fragment 类中。从理论上讲,这应该可以更直接地测试和模拟 Client 类(使用 mockk)。但是,在尝试使用 Android FragmentScenario 运行测试时,测试似乎在某处陷入无限循环(调试没有给出原因的答案)。有没有人对如何与我们正在使用的框架一起测试这个有任何进一步的想法。Android/Google 文档没有提供任何帮助,也没有提供数小时的网络搜索。
我们尝试在注入和不注入 FusedLocationProvideClient 的情况下进行测试。我们尝试在我们的测试类中启动 Koin 测试模块,使用活动进行参数化,而没有,似乎没有任何区别。FusedLocationProviderClient 被轻松设置为 true。
测试类:
private val viewModel = mockk<LocationSelectionViewModel>(relaxed = true)
private val locationClient = mockk<FusedLocationProviderClient>(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
陷入无限循环