Android アプリ内では、ユーザーの位置を表示するために Google Maps API を使用しています。現時点では、FusedLocationProviderClient 依存関係のパラメーター化された注入 (アクティビティが必要) を Fragment クラスに提供するために Koin を使用しています。理論的には、これにより (mockk を使用した) Client クラスのテストとモックがより簡単になります。ただし、Android FragmentScenario でテストを実行しようとすると、どこかでテストが無限ループでハングしているように見えます (理由についてはデバッグで答えが得られません)。私たちが使用しているフレームワークと一緒にこれをテストする方法について、さらにアイデアがある人はいますか? Android/Google のドキュメントは何の支援も提供せず、何時間も Web をトロールすることもありません。
FusedLocationProvideClient のインジェクションの有無にかかわらずテストを試みました。テスト クラスで Koin テスト モジュールを起動しようとしましたが、アクティビティを使用してパラメータ化したものと使用しなかったものがありますが、違いはないようです。FusedLocationProviderClient は、relaxed を 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
無限ループに陥る