为什么“ getSharedPreferences”在单元测试中返回null?

阿兹软件公司

我的课程是用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!在我的测试课上。

有可能在我的测试方法中得到它吗?

ili

您不应该以这种方式测试您的代码。您应该为要模拟的类创建一个接口:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在单元测试中从控制器转换结果返回 null?

Junit 5的Spring Boot单元测试为什么模拟返回null

为什么我的GZip单元测试返回异常?

为什么在PACT测试中需要单元测试?

为什么在单元测试中对instanceOf的测试失败?

SonarQube为什么声称“返回”行未包含在单元测试中?

为什么不println!在Rust单元测试中工作?

为什么C ++单元测试在模具程序中失败

为什么 Python 中的单元测试需要 -m 选项?

为什么在单元测试中无法访问该类?

为什么我的单元测试在此React测试中返回“无法读取未定义的属性”模拟”?

单元测试。为什么Mock在第二个循环迭代中返回不同的值?

单元测试存储库。为什么DBContext返回错误的值?

为什么要进行单元测试和功能测试

为什么在Visual Studio单元测试中的每个测试都会触发TestInitialize?

什么是单元测试?

为什么我的单元测试在Chrome中通过但在PhantomJS中失败?

为什么在单元测试中主源代码树中的“内部”类型不可见?

为什么不能识别“异步无效”单元测试?

为什么我失败的Ruby单元测试不会失败?

为什么我的单元测试未能通过switch语句?

为什么与JSONObject相关的单元测试失败?

iOS为什么单元测试类调用ViewController

AngularJS单元测试,为什么有用?

为什么添加参数后我的单元测试失败?

为什么在Flutter中将单元测试标记为异步

为什么rdmd不能运行所有单元测试?

为什么我的某些单元测试要多次运行?

为什么我的Vue单元测试无法识别功能?