如何为我的gps交互器类编写单元测试?

时间:2019-10-22 08:44:46

标签: android unit-testing kotlin

该类工作正常,现在我很有趣如何编写单元测试

我有两个独立的流程:

  • 位置
  • gps状态

我使用发布主题使我的交互者以反应方式进行。 两种流都与功能 Observable.withLatestFrom 混合,在此我还添加了过滤和转换。

我的gps类写的正确吗?

可以对此类进行测试吗?

我需要测试 initFullLocationObservable

class GpsInteractor @Inject constructor(
        private val locationManager: LocationManager,
        private val googleApiClient: GoogleApiClient,
        private val locationRequest: LocationRequest): GoogleApiClient.ConnectionCallbacks, LocationListener, GpsStatus.Listener {

        private var gpsStatus: GpsStatus? = null
        val locationSubject = PublishSubject.create<LocationModel>()
        val satellitesSubject = PublishSubject.create<List<SatelliteModel>>()
        lateinit var fullLocationObservable: Observable<FullLocation> private set

        @SuppressLint("MissingPermission")
        fun callLocationUpdates(updateInterval: Int, smallestDisplacement: Int, minAccuracy: Int, minSatellitesCount: Int, minSnr: Int) {
            locationRequest.interval = (updateInterval * 1000).toLong()
            locationRequest.fastestInterval = (updateInterval * 1000).toLong()
            locationRequest.smallestDisplacement = smallestDisplacement.toFloat()
            locationRequest.priority = LocationRequest.PRIORITY_HIGH_ACCURACY

            googleApiClient.registerConnectionCallbacks(this)
            locationManager.addGpsStatusListener(this)

            fullLocationObservable = initFullLocationObservable(minAccuracy, minSatellitesCount, minSnr)
            googleApiClient.connect()
        }

        fun removeLocationUpdates() {
            locationManager.removeGpsStatusListener(this)
            if (googleApiClient.isConnected) {
                LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient, this)
                googleApiClient.disconnect()
            }
        }

        @SuppressLint("MissingPermission")
        override fun onConnected(p0: Bundle?) {  LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, locationRequest, this)
        }  

        override fun onLocationChanged(location: Location) {
            // TODO: make locationModel reusable
            locationSubject.onNext(LocationModel(latitude = location.latitude, longitude = location.longitude,
                time = location.time, speed = location.speed, accuracy = location.accuracy,
                altitude = location.altitude, bearing = location.bearing))
        }

        @SuppressLint("MissingPermission")
        override fun onGpsStatusChanged(event: Int) {
            if (event != GpsStatus.GPS_EVENT_SATELLITE_STATUS) {
                return
            }
            gpsStatus = locationManager.getGpsStatus(gpsStatus)
            if (gpsStatus != null) {
                // TODO: make satellitesModel reusable
                val satellites: List<SatelliteModel> = gpsStatus!!
                    .satellites.filter { it.usedInFix() }
                    .map { SatelliteModel(it.prn, it.elevation, it.azimuth, it.snr) }
                satellitesSubject.onNext(satellites)
            }
        }

        private fun initFullLocationObservable(minAccuracy: Int, minSatellitesCount: Int, minSnr: Int): Observable<FullLocation> {
            val locationObservable = locationSubject
                .filter { locationModel -> locationModel.accuracy <= minAccuracy }

            val satellitesObservable = satellitesSubject
                .map { satellites: List<SatelliteModel> ->
                    satellites.filter { it.snr  >= minSnr }
                }
                .filter { it.size >= minSatellitesCount }

            return locationObservable.withLatestFrom(satellitesObservable, BiFunction { locationModel: LocationModel, satellitesModel: List<SatelliteModel> ->
                val locationData = LocationData(locationModel)
                val satellites = satellitesModel.map { Satellite(it.snr, locationData) }
                FullLocation(locationData, satellites)
            })
        }
    }

0 个答案:

没有答案