Android Studio 3.5.3
Kotlin 1.3
Ich versuche, einfachen Code zu testen, erhalte jedoch immer wieder die folgende Ausnahme:
IllegalStateException: gsonWrapper.fromJson<Map…ring, String>>() {}.type) must not be null
Ich benutze den Spion und verspotte die Rückgabe, damit sie eine Null zurückgibt. Da möchte ich den Fehlerpfad testen.
Ich bin mir nicht sicher, ob ich mit meinem Stubbing etwas falsch mache oder nicht. Kann diese Ausnahme jedoch nicht beheben.
Verwenden einer Wrapper-Klasse zum Umschließen der gson-Implementierung und Ausspionieren dieser im Test
public class GsonWrapper implements IGsonWrapper {
private Gson gson;
public GsonWrapper(Gson gson) {
this.gson = gson;
}
@Override public <T> T fromJson(String json, Type typeOf) {
return gson.fromJson(json, typeOf);
}
}
Implementierung meiner Klasse, die getestet wird
class MoviePresenterImp(
private val gsonWrapper: IGsonWrapper) : MoviePresenter {
private companion object {
const val movieKey = "movieKey"
}
override fun saveMovieState(movieJson: String) {
val movieMap = serializeStringToMap(movieJson)
when (movieMap.getOrElse(movieKey, {""})) {
/* do something here */
}
}
// Exception return from this method
private fun serializeStringToMap(ccpaStatus: String): Map<String, String> =
gsonWrapper.fromJson<Map<String, String>>(ccpaStatus, object : TypeToken<Map<String, String>>() {}.type) // Exception
}
Die eigentliche Testklasse, einfach alles einfach halten
class MoviePresenterImpTest {
private lateinit var moviePresenterImp: MoviePresenterImp
private val gsonWrapper: GsonWrapper = GsonWrapper(Gson())
private val spyGsonWrapper = spy(gsonWrapper)
@Before
fun setUp() {
moviePresenterImp = MoviePresenterImp(spyGsonWrapper)
}
@Test
fun `should not save any movie when there is an error`() {
// Arrange
val mapType: Type = object : TypeToken<Map<String, String>>() {}.type
whenever(spyGsonWrapper.fromJson<Map<String, String>>("{\"movie\":\"movieId\"}", mapType)).thenReturn(null)
// Act
moviePresenterImp.saveMovieState("{\"movie\":\"movieId\"}")
// Assert here
}
}
Vielen Dank für alle Vorschläge,
quelle
non-null
. Ich denke, was ich erreichen möchte, ist die Rückgabe einer Karte mit null Inhalten. WannmovieMap.getOrElse()
wird also eine Null zurückgegeben? Das habe ich verspottet. Ich bin mir nicht sicher, wie ich die MovieMap mit einer Null versehen soll.Mit Ihrem Setup suchen Sie
emptyMap()
stattnull
Dies entspricht der Signatur, da sie nicht null ist
Außerdem wird der else-Block innerhalb des
movieMap.getOrElse()
Anrufs eingegeben .quelle