我的课程是用Kotlin编写的,这是我的SharedPreferenceHandler
class SharedPreferenceHandler(sharedPrefs: SharedPreferences) {
companion object {
var mInstance: SharedPreferenceHandler = SharedPreferenceHandler(getPrefs())
private fun getPrefs(): SharedPreferences {
return Application.mInstance.getSharedPreferences(
"myApp", Context.MODE_PRIVATE)
}
fun getInstance(): SharedPreferenceHandler {
return mInstance
}
}
private var sharedPreferences = sharedPrefs
var accessToken: String?
get() = sharedPreferences.getString(SharedPreference.ACCESS_TOKEN.name, null)
set(token) = sharedPreferences.edit().putString(SharedPreference.ACCESS_TOKEN.name, token).apply()
}
这是在主持人中调用的方法:
override fun reload(vm: ViewModel) {
super.updateViewModel(vm) {
//some stuffs
}
}
这是我的测试方法:
@Test
public void reload() {
when(SharedPreferenceHandler.Companion.getMInstance().getAccessToken()).thenReturn("234234234234234");
presenter.reload(viewModel);
}
在来自super.updateViewModel(vm)的处理程序中,我称“ SharedPreferenceHandler.mInstance.accessToken !!)”
那就是抛出的:
由以下原因引起:java.lang.IllegalStateException:Application.mInstanc…m“,Context.MODE_PRIVATE)在com.zuum的com.zuum.zuumapp.preferences.SharedPreferenceHandler $ Companion.getPrefs(SharedPreferenceHandler.kt:18)处不得为null。 com.zuum.zuumapp.preferences.SharedPreferenceHandler。(SharedPreferenceHandler.kt:15)上的zuumapp.preferences.SharedPreferenceHandler $ Companion.access $ getPrefs(SharedPreferenceHandler.kt:14)
我想通过调用“ SharedPreferenceHandler.mInstance.accessToken !!”来获得accessToken!在我的测试课上。
有可能在我的测试方法中得到它吗?
您不应该以这种方式测试您的代码。您应该为要模拟的类创建一个接口:
interface MySharedPreferences {
fun getAccessToken(): String
}
让您的SharedPreferencesHandler实现此接口。然后在演示者(或您要测试的其他类)中,将依赖项(例如,通过构造函数或Dagger / Kodein之类的框架)注入对象。然后就有可能轻松模拟此接口。我假设在@Before创建类之前要进行测试-然后只需将模拟的SharedPreferencesHandler作为参数传递。
可以使用静态依赖项来测试事物,但这是棘手的(很多人认为静态依赖项是反模式)。此处介绍了操作方法:如何进行android单元测试和模拟静态方法
例:
class MyPresenter(val sp: MySharedPreferences) {
/* some code here */
fun validateToken() {
if (sp.getAccessToken() == "") throw new Exception()
}
}
就像您看到的那样sp
,将其作为参数注入到此类中。通常,您不是直接在代码中而是通过DI框架(例如Dagger或Kodein)创建视图/演示者等。无论如何,静态依赖项不容易测试。可以模拟注入的接口依赖性,并且您不是在对象上进行操作,而是在行为上进行操作(因此,它具有更大的抽象层次)。因此,现在在测试中,您要做的就是:
class MyTest() {
@Mock lateinit var sharedPreferencesMock: MySharedPreferences
lateinit var instance: MyPresenter
@Before
fun setUp() {
instance = MyPresenter(sharedPreferencesMock)
}
@Test
fun testSomething() {
`when`(sharedPreferencesMock.getAccessToken()).thenReturn("myAccessToken")
/* here is your test body */
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句