【发布时间】:2017-11-06 22:51:20
【问题描述】:
我正在尝试在测试工具中模拟 UseCase 依赖项。
我正在创建一个@Rule 来处理这个问题:
LocationsUseCaseRule.kt
class LocationsUseCaseRule : ExternalResource() {
@Mock
lateinit var locationsUseCase : LocationsUseCase
@Throws(Throwable::class)
override fun before() {
super.before()
LocationsUseCase.setInstance(locationsUseCase)
}
}
但是当我点击before() 时,未加载用例。
我在单元测试中有相同的实现,它可以工作。
这些是我的依赖项:
// Mockito
def mockitoVersion = "2.6.3"
testCompile 'org.mockito:mockito-core:' + mockitoVersion
androidTestCompile 'org.mockito:mockito-core:' + mockitoVersion
androidTestCompile "org.mockito:mockito-android:" + mockitoVersion
testCompile "com.nhaarman:mockito-kotlin-kt1.1:1.5.0"
这就是我在LocationsUseCase 中设置我的实例的方式:
object Singleton {
var instance: LocationsUseCase? = null
}
companion object {
fun setInstance(locationsUseCase: LocationsUseCase?) {
Singleton.instance = locationsUseCase
}
fun getInstance(): LocationsUseCase {
if (Singleton.instance == null) {
Singleton.instance = LocationsUseCase(
LocationsRepository.instance
)
}
return Singleton.instance!!
}
}
【问题讨论】:
-
LocationsUseCase.setInstance的代码是什么? -
我刚刚修改了问题。谢谢
-
您将未初始化的
locationsUseCase传递给LocationsUseCase.setInstance,因此出现错误。你不是说LocationsUseCase.setInstance(LocationsUseCase.getInstance())吗? -
另外,当你可以简单地做
object Singleton { val instance = LocationsUseCase( LocationsRepository.instance) }时,你为什么要做所有这些? -
Mmmmm 似乎是这样工作的,但我在单元测试中有相同的代码(或基本相似),而且它工作正常。