2017-01-08 3 views
2

Я начинаю использовать Kotlin в небольшом демонстрационном приложении для Android. Я создал вспомогательный класс sharedpreferences, который я пытаюсь проверить с Junit и Mockito. Ниже мой sharedprefshelper:nullPointerException on sharedpreferences Вспомогательный класс При запуске теста

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 (ключ, значение) .commit()

кидает исключения нулевого указателя? не знаете почему? Я установка фиктивного sharedprefs и sharedpreferences.Edit в методе тестового класса с аннотацией @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!!) 
    } 

я уверен, что мой код менее оптимальным.

EDIT:

Вот мое исправление для метода 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() 
} 

ответ

3

Вы должны установить ожидания ниже вызов на вашем фиктивном объекте (mockprefsedit). Также для возвращаемого объекта, на который вызывается commit.

edit!!.putString(key, value) 

благодаря Sriram

+0

ах да. Я вижу, что я сделал сейчас. явный идиотизм с моей стороны! –

Смежные вопросы