Android Studio 3.5.3
Kotlin 1.3
Estoy tratando de probar un código simple pero sigo recibiendo la siguiente excepción:
IllegalStateException: gsonWrapper.fromJson<Map…ring, String>>() {}.type) must not be null
Estoy usando el espía y burlando el retorno para que devuelva un valor nulo. Como quiero probar la ruta de error.
No estoy seguro de si estoy haciendo algo mal con mi tropezón o no. Pero parece que no puede resolver esta excepción.
Usar una clase contenedora para ajustar la implementación de gson y espiar esto en la prueba
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);
}
}
Implementación de mi clase que está bajo prueba
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
}
La clase de prueba real, simplemente manteniendo todo simple
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
}
}
Muchas gracias por las sugerencias,
fuente
non-null
. Creo que lo que estoy tratando de lograr es devolver un mapa que tenga contenido nulo. Entonces, cuandomovieMap.getOrElse()
devolverá un nulo. Eso es lo que estaba tratando de burlarme. Hacer que el movieMap contenga un valor nulo es algo que no estoy seguro de cómo hacer.Con su configuración que está buscando en
emptyMap()
lugar denull
Esto cumplirá con la firma, ya que no es nula
También ingresará el bloque else dentro de la
movieMap.getOrElse()
llamada.fuente