在我们的Android应用程序中,我们使用Google Maps API来显示用户位置。目前,我们正在使用Koin以便将FusedLocationProviderClient依赖项的参数注入(需要活动)添加到Fragment类中。从理论上讲,这应该可以更直接地测试和模拟Client类(带有模拟)。但是,在尝试使用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 itShouldFuckingDoSOmeShitWIthLocation() {
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
陷入无限循环