6

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

無限ループに陥る

4

0 に答える 0