2017-01-08 2 views
2

Ich fange an, Kotlin auf einer kleinen Demo-Android-App zu verwenden. Ich habe eine Hilfsklasse sharedpreferences erstellt, die ich versuche, mit Junit und Mockito zu testen. Unten ist mein sharedprefshelper:nullPointerException auf sharedpreferences helper class Bei der Ausführung eines Tests

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

hier ist meine Testklasse:

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", "") 
} 

} 

Ausgabe ist, wenn ich addPrefsValueString() im Helfer nennen. die Linie

bearbeiten !!. putString (Schlüssel, Wert) .commit()

wirft eine Null-Zeiger Ausnahme? nicht sicher warum? Ich habe Setup die Mock sharedprefs und sharedpreferences.Edit in der Methode Testklasse mit Anmerkungen versehen mit @Before (siehe unten)

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

ich bin sicher, dass mein Code ist weniger als optimal.

EDIT:

Hier ist meine Lösung für die testItemAdded() Methode. müssen den Mock Preferences Editor beim ersten Aufruf zurückgeben.

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

Antwort

3

Sie sollten unter den Erwartungen für den Rufaufbau, auf Ihrem Mock-Objekt (mockprefsedit). Auch für das zurückgegebene Objekt, auf dem commit aufgerufen wird.

edit!!.putString(key, value) 

dank Sriram

+0

ah ja. Ich sehe was ich jetzt gemacht habe. schiere Idiotie meinerseits! –

Verwandte Themen