sharedpreferences上的nullPointerException helper类运行测试时

我开始在一个小演示android应用程序上使用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注释的测试类方法中编辑(如下所示)

 @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() } 

你应该在你的模拟对象( mockprefsedit )上设置下面调用的期望值。 以及返回的对象,在哪个commit被调用。

 edit!!.putString(key, value) 

感谢Sriram