Android Studio 3.5.3
Kotlin 1.3Estoy tratando de probar un código simple pero sigo recibiendo la siguiente excepción:
IllegalStateException: gsonWrapper.fromJson<Map…ring, String>>() {}.type) must not be nullEstoy 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 denullEsto cumplirá con la firma, ya que no es nula
También ingresará el bloque else dentro de la
movieMap.getOrElse()llamada.fuente