【问题标题】:nullPointerException on sharedpreferences helper class When running a testsharedpreferences 助手类上的 nullPointerException 运行测试时
【发布时间】:2017-01-08 17:00:13
【问题描述】:

我开始在一个小演示 a​​ndroid 应用上使用 Kotlin。我创建了一个sharedpreferences 助手类,我正在尝试用Junit 和Mockito 进行测试。下面是我的 sharedprefshelper:

public class SharedPrefsHelperImp( cont : Context) : SharedPrefsHelper {

val prefsname: String = "prefs"
var prefs: SharedPreferences? = null
var edit: SharedPreferences.Editor? = null


init {
    prefs = cont.getSharedPreferences(prefsname, Context.MODE_PRIVATE)
    edit = prefs!!.edit()
}



override fun getPrefsStringValue(key: String) : String {
    return prefs!!.getString(key, "")
}

 override fun addPrefsStringVal( key : String,  value: String)  {
        edit!!.putString(key, value).commit()
}

override fun getSharedPrefsBool(key : String): Boolean {
    return prefs!!.getBoolean(key, false)
}

override fun addSharedPrefsBool(key : String, value : Boolean) {
        edit!!.putBoolean(key, value).commit()
}
}

这是我的测试课:

class SharedPrefsHelperImpTest {

@Mock var  cont : Context? = null
@Mock var mockprefs : SharedPreferences? = null
@Mock var mockprefsedit : SharedPreferences.Editor? = null
var prefshelper : SharedPrefsHelper? = null

@Before
fun setUp() {

    //MockitoAnnotations.initMocks(this)
    cont = Mockito.mock(Context::class.java)
    mockprefs = Mockito.mock(SharedPreferences::class.java)
    mockprefsedit = Mockito.mock(SharedPreferences.Editor::class.java)

    `when`(cont!!.getSharedPreferences(anyString(), anyInt())).thenReturn(mockprefs!!)
    `when`(mockprefs!!.edit()).thenReturn(mockprefsedit!!)

    prefshelper = SharedPrefsHelperImp(cont!!)
}

@Test
fun testNotNull(){
    Assert.assertNotNull(cont)
    Assert.assertNotNull(mockprefs)
    Assert.assertNotNull(mockprefsedit)
}

@Test
fun testItemAdded()
{
    prefshelper!!.addPrefsStringVal("thing", "thing")
    verify(mockprefsedit)!!.putString(anyString(), anyString())
}

@Test
fun testGetString()
{
    prefshelper!!.getPrefsStringValue("key")
    verify(mockprefs)!!.getString("key", "")
}

}

问题是当我在助手中调用addPrefsValueString() 时。线

编辑!!.putString(key, value).commit()

抛出空指针异常?不知道为什么?我已经在使用@Before 注释的测试类方法中设置了模拟sharedprefssharedpreferences.Edit(如下所示)

@Before
fun setUp() {

    //MockitoAnnotations.initMocks(this)
    cont = Mockito.mock(Context::class.java)
    mockprefs = Mockito.mock(SharedPreferences::class.java)
    mockprefsedit = Mockito.mock(SharedPreferences.Editor::class.java)

    `when`(cont!!.getSharedPreferences(anyString(), anyInt())).thenReturn(mockprefs!!)
    `when`(mockprefs!!.edit()).thenReturn(mockprefsedit!!)

    prefshelper = SharedPrefsHelperImp(cont!!)
   }

我确定我的代码不是最优的。

编辑:

这是我对testItemAdded() 方法的修复。需要在第一次调用时返回模拟首选项编辑器。

@Test
fun testItemAdded()
{
    `when`(mockprefsedit?.putString(anyString(), anyString())).thenReturn(mockprefsedit)
    `when`(mockprefsedit?.commit()).thenReturn(true)
    prefshelper!!.addPrefsStringVal("thing", "thing")

    verify(mockprefsedit)!!.putString(anyString(), anyString())
    verify(mockprefsedit)!!.commit()
}

【问题讨论】:

    标签: android mockito kotlin android-testing


    【解决方案1】:

    您应该在您的模拟对象 (mockprefsedit) 上为下面的调用设置期望。以及返回的对象,在该对象上调用了 commit

    edit!!.putString(key, value)
    

    谢谢 斯里拉姆

    【讨论】:

    • 啊是的。我明白我现在做了什么。就我而言,这简直是白痴!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 2016-02-11
    • 1970-01-01
    • 2011-07-21
    • 2017-01-15
    相关资源
    最近更新 更多