【发布时间】:2017-10-25 14:36:47
【问题描述】:
所以我有存储库,它为客户端提供 Observable。有没有办法可以模拟这个存储库,所以我不需要从我的模拟器发送位置或使用真实设备来获取一些位置?
界面如下:
interface RxLocationRepository {
@SuppressLint("MissingPermission")
fun onLocationUpdate(): Observable<Location>
fun stopLocationUpdates()
}
在我的客户端我这样使用:
class LocationManager(
val rxLocationRepository: RxLocationRepository){
private fun appendGeoEvent(location: Location) {
val locationGeoEvent = LocationGeoEvent(
accuracy = location.accuracy.toDouble(),
latitude = location.latitude,
longitude = location.longitude,
timestampGeoEvent = location.time
)
processGeoEvent(locationGeoEvent)
}
compositeDisposable.add(rxLocationRepository.onLocationUpdate()
.subscribe(Consumer { location ->
appendGeoEvent(location)
}))
....
所以我将这个获得的位置发送到我的 appendGeoEvent 方法。
我可以使用例如 Mockito,但我不知道如何模拟这个存储库,所以我可以使用假位置。 另外,我想使用 Kotlin。
【问题讨论】:
-
如何使用
RxLocationRepository的依赖关系? -
@tynn 我更新了我的问题,不知道你是什么意思。我使用 Dagger 将我的存储库注入到客户端
-
啊,好的。所以我需要创建另一个模块,它只在我的测试包中?所以在 Dagger 中,我不能通过构造函数提供这个 Repository,而只是在测试中手动添加它,或者如何用 dagger 实现这个?在此之后,ESala 的答案似乎是合法的
-
@okset 我认为您不需要另一个 Dagger 模块。此外,您的
LocationManager不使用存储库,因此您可以将其从构造函数中删除。无论如何,您需要考虑您真正测试的是什么。如果您正在测试LocationManager.appendGeoEvent(...)方法,那么您甚至不需要存储库模拟,只需像我的答案一样创建一个测试位置并使用它来调用该方法。希望这会有所帮助;) -
它实际上使用这个存储库,我刚刚删除了“附加”功能,所以我只依赖从存储库传递的位置
标签: unit-testing mockito kotlin rx-java rx-java2